62 lines
796 B
TypeScript
62 lines
796 B
TypeScript
|
|
/**
|
|
*/
|
|
interface type_element extends lib_plankton.call.type_coproduct
|
|
{
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
let element_kind_pool : Record<
|
|
string,
|
|
(
|
|
(
|
|
data : any,
|
|
make : ((raw : any) => type_element)
|
|
)
|
|
=>
|
|
type_element
|
|
)
|
|
> = {};
|
|
|
|
|
|
/**
|
|
*/
|
|
function element_kind_register(
|
|
name : string,
|
|
factory : (
|
|
(data : any, make : ((raw : any) => type_element))
|
|
=>
|
|
type_element
|
|
)
|
|
) : void
|
|
{
|
|
if (name in element_kind_pool)
|
|
{
|
|
throw (new Error("kind '" + name + "' already registered"));
|
|
}
|
|
else
|
|
{
|
|
element_kind_pool[name] = factory;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
*/
|
|
function element_make(
|
|
raw : any
|
|
) : type_element
|
|
{
|
|
if (! (raw["kind"] in element_kind_pool))
|
|
{
|
|
throw (new Error("kind '" + raw["kind"] + "' not registered"));
|
|
}
|
|
else
|
|
{
|
|
return element_kind_pool[raw["kind"]](raw["data"], element_make);
|
|
}
|
|
}
|
|
|