UNPKG

structured-elements

Version:

A TypeScript package for modelling and validating data

94 lines 3.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildMirrorValidator = void 0; const mirror_1 = require("../../attemptSalvage/mirror"); const validationResult_1 = require("../validationResult"); const referencedValidator_1 = require("../../ensure/referencedValidator"); const mirror_2 = require("../../is/mirror"); const structure = `mirror`; const buildMirrorValidator = ({ api, expectation, }) => { const validator = { getFailures: (subject, name) => { return validator.validate(subject, name).failures; }, getSalvage: (subject, name, attemptSalvage = mirror_1.attemptSalvageMirror) => { return validator.validate(subject, name, attemptSalvage).salvage; }, isValid: (subject, name) => { return validator.getFailures(subject, name).length === 0; }, validate: (subject, name, attemptSalvage = mirror_1.attemptSalvageMirror) => { if (!(0, mirror_2.isMirror)(subject)) { return (0, validationResult_1.buildValidationResult)({ failures: [ { element: subject, expectation, key: `subject`, name, reason: `${name} expected to be a Mirror, but isn't. A Mirror must have a readonly array and a readonly collection, each containing the same elements.`, subject, }, ], subject, }); } const keys = Object.keys(subject.collection); if (keys.length !== subject.array.length) { return (0, validationResult_1.buildValidationResult)({ failures: [ { element: subject, expectation, key: `subject`, name, reason: `Mirror ${name} has mismatched length, with ${keys.length} collection entries and ${subject.array.length} array entries.`, subject, }, ], subject, }); } const target = expectation; const arrayValidator = (0, referencedValidator_1.ensureReferencedValidator)({ api, container: api.reference(`array`, target), }); const collectionValidator = (0, referencedValidator_1.ensureReferencedValidator)({ api, container: api.reference(`collection`, target), }); const arrayResult = arrayValidator.validate(subject.array, `${name}.array`); const collectionResult = collectionValidator.validate(subject.collection, `${name}.collection`); const failures = [ ...arrayResult.failures, ...collectionResult.failures, ]; const validElements = { array: arrayResult.salvage || [], collection: collectionResult.salvage || {}, }; const salvage = attemptSalvage({ api, failures, name, subject, validElements, }); const result = (0, validationResult_1.buildValidationResult)({ failures, salvage, subject, }); api.privateFunctions.cacheResult({ expectation, result, structure, }); return result; }, }; return validator; }; exports.buildMirrorValidator = buildMirrorValidator; //# sourceMappingURL=mirror.js.map