structured-elements
Version:
A TypeScript package for modelling and validating data
94 lines • 3.92 kB
JavaScript
;
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