// deno-lint-ignore-file no-explicit-any import { isRecordEmpty, Result, TaggedError } from "@fabric/core"; import type { FieldDefinition, Model, ModelToType } from "../index.ts"; import { fieldParsers, type FieldParsingError } from "./field-parsers.ts"; export function parseFromModel< TModel extends Model, >( model: TModel, value: unknown, ): Result, SchemaParsingError> { const parsingErrors = {} as Record; const parsedValue = {} as ModelToType; for (const key in model) { const field = model[key] as FieldDefinition; const fieldResult = fieldParsers[field._tag](field as any, value); if (fieldResult.isOk()) { parsedValue[key as keyof ModelToType] = fieldResult .value(); } else { parsingErrors[key] = fieldResult.unwrapErrorOrThrow(); } } if (!isRecordEmpty(parsingErrors)) { return Result.failWith(new SchemaParsingError(parsingErrors, parsedValue)); } else { return Result.succeedWith(parsedValue); } } export class SchemaParsingError extends TaggedError<"SchemaParsingFailed"> { constructor( public readonly errors: Record, public readonly value?: Partial>, ) { super("SchemaParsingFailed"); } }