import { BasicBuilder } from './basic'; import { $FieldSetValue, FormModel, BasicModel } from '../models'; import { $FieldSetBuilderChildren, $FieldSetBuilderDefaultValue } from './set'; import { Maybe, Some, or } from '../maybe'; export class FormBuilder< ChildBuilders extends Record, Builder extends BasicBuilder, Model extends BasicModel > extends BasicBuilder< $FieldSetValue<$FieldSetBuilderChildren>, FormModel<$FieldSetBuilderChildren> > { constructor(private readonly _childBuilders: ChildBuilders) { super(); } build(defaultValues?: Maybe<$FieldSetBuilderDefaultValue>) { const defaults = or<$FieldSetBuilderDefaultValue>(defaultValues, () => ({})); const children = {} as $FieldSetBuilderChildren; Object.keys(this._childBuilders).forEach((key: keyof ChildBuilders) => { const childBuilder = this._childBuilders[key]; if (defaults.hasOwnProperty(key)) { children[key] = childBuilder.build(Some(defaults[key])); } else { children[key] = childBuilder.build(null); } }); const model = new FormModel<$FieldSetBuilderChildren>(children); model.validators = this._validators; return model; } }