import {attrGet, attrSet} from "./attr-fns.js"
import {AttrSpec, AttrTypes} from "../../types.js"
export type AttrSpecOptions = {
beforeSet?: (attrKey: string) => void
afterSet?: (attrKey: string) => void
}
/** specify available html attributes and their types and create a proxy accessor */
export const attrSpec = (
e: HTMLElement,
spec: A,
options: AttrSpecOptions = {},
) => new Proxy(spec, {
get: (_target, key: string) => {
switch (spec[key]) {
case String: return attrGet.string(e, key)
case Number: return attrGet.number(e, key)
case Boolean: return attrGet.boolean(e, key)
default: throw new Error(`invalid attribute type for "${key}"`)
}
},
set: (_target, key: string, value: any) => {
try {
options.beforeSet?.(key)
switch (spec[key]) {
case String: return attrSet.string(e, key, value)
case Number: return attrSet.number(e, key, value)
case Boolean: return attrSet.boolean(e, key, value)
default: throw new Error(`invalid attribute type for "${key}"`)
}
}
finally {
options.afterSet?.(key)
}
},
}) as any as AttrTypes