import { BasicBuilder } from './basic'; import { FieldSetModel, $FieldSetValue } from '../models'; import { Maybe, Some, None, or } from '../maybe'; export type $FieldSetBuilderChildren>> = { [Key in keyof ChildBuilders]: ChildBuilders[Key]['phantomModel']; }; export type $FieldSetBuilderDefaultValue>> = Partial< $FieldSetValue<$FieldSetBuilderChildren> >; export class FieldSetBuilder>> extends BasicBuilder< $FieldSetValue<$FieldSetBuilderChildren>, FieldSetModel<$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(None()); } }); const model = new FieldSetModel<$FieldSetBuilderChildren>(children); model.validators = this._validators; return model; } }