UNPKG

structured-elements

Version:

A TypeScript package for modelling and validating data

82 lines (68 loc) 1.87 kB
import { attemptSalvageItem } from "@/attemptSalvage/item" import { buildValidationResult } from "@/build/validationResult" import { validateElement } from "@/validate/element" import type { StructuredElements } from "@" const structure = `item` as const export const buildPrimitiveValidator = < Registry extends StructuredElements.BaseRegistry, Subject, >({ api, expectation, }: { api: StructuredElements.API<Registry> expectation: StructuredElements.Expectation<Registry, Subject> }): StructuredElements.Validator<Subject, `item`> => { const validator: StructuredElements.Validator<Subject, `item`> = { getFailures: (subject, name) => { return validator.validate(subject, name).failures }, getSalvage: (subject, name) => { return validator.validate(subject, name).salvage }, isValid: (subject, name): subject is Subject => { return validator.validate(subject, name).valid }, validate: ( subject, name, attemptSalvage = attemptSalvageItem, ): StructuredElements.ValidationResult<Subject> => { const cached = api.privateFunctions.getCachedResult({ expectation, structure, subject, }) if (cached) { return cached } const failures = validateElement({ api, element: subject, elementName: name, expectation, key: `(subject)`, subject, subjectName: name, }) const salvage = attemptSalvage<Registry, Subject>({ api, subject, name, failures, }) const result = buildValidationResult<Subject>({ failures, salvage, subject, }) api.privateFunctions.cacheResult({ expectation, result, structure, }) return result }, } return validator }