diff --git a/documentation/data/readme.md b/documentation/data/readme.md new file mode 100644 index 0000000..b0727a3 --- /dev/null +++ b/documentation/data/readme.md @@ -0,0 +1,9 @@ +# @efforting.tech/data + +Data processing modules. + +**TODO:** *Explain in more detail what this vague description actually refers to.* + +## field-configuration-factories.mjs + +Currently there are a few factories defined but we might add more as specific needs arises throughout the library. diff --git a/source/data/field-configuration-factories.mjs b/source/data/field-configuration-factories.mjs index 4a05668..d6f0749 100644 --- a/source/data/field-configuration-factories.mjs +++ b/source/data/field-configuration-factories.mjs @@ -17,4 +17,12 @@ export function typed_value(coercion_function, default_value, description) { export function typed_factory(coercion_function, factory_function, description) { return new Field_Configuration(null, coercion_function, factory_function, description); -} \ No newline at end of file +} + +export function required(description) { + return new Field_Configuration((value) => value !== undefined, null, null, description); +} + +export function typed_required(coercion_function, description) { + return new Field_Configuration((value) => value !== undefined, coercion_function, null, description); +} diff --git a/source/data/field-configuration.mjs b/source/data/field-configuration.mjs index 4971bfc..827e1db 100644 --- a/source/data/field-configuration.mjs +++ b/source/data/field-configuration.mjs @@ -53,12 +53,12 @@ export class Field_Configuration { export class Schema { - constructor(field_schema) { - Object.assign(this, { field_schema }); + constructor(field_schema, name=undefined) { + Object.assign(this, { field_schema, name }); } load(value={}, target=undefined) { - const { field_schema } = this; + const { field_schema, name } = this; for (const [value_name, value_value] of Object.entries(value)) { if (!field_schema[value_name]) { @@ -69,8 +69,10 @@ export class Schema { } const result = {}; + const this_schema = name ? `schema "${name}"` : 'untitled schema'; + for (const [field_name, field_config] of Object.entries(field_schema)) { - const sub_target = { schema: this, field_name, field_config, parent_target: target }; + const sub_target = { schema: this, name: field_name, config: field_config, parent_target: target, info: `Field "${field_name}" of ${this_schema}` }; result[field_name] = field_config.load(value[field_name], sub_target); } diff --git a/source/rule-processing/resolvers.mjs b/source/rule-processing/resolvers.mjs index 47fe57a..f958458 100644 --- a/source/rule-processing/resolvers.mjs +++ b/source/rule-processing/resolvers.mjs @@ -30,6 +30,7 @@ export class Chained_Resolver extends Abstract_Resolver { export class Mapping_Resolver extends Abstract_Resolver { constructor(rules=new Map(), key_function=null) { + super(); Object.assign(this, { rules, key_function }); }