castage
Version:
A type-safe library for dynamic object casting and ensuring type consistency in JavaScript/TypeScript.
51 lines (50 loc) • 2.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.record = void 0;
const resultage_1 = require("resultage");
const engine_js_1 = require("./engine.js");
const types_js_1 = require("./types.js");
const predicates_js_1 = require("./predicates.js");
const tools_js_1 = require("./tools.js");
const casting_error_js_1 = require("./casting-error.js");
const transform = (keyCaster, valueCaster) => (value, path) => {
const result = {};
const keys = (0, tools_js_1.propertyKeys)(value);
for (let i = 0; i < keys.length; i += 1) {
const k = keys[i];
const v = value[k];
const keyResult = keyCaster(k, path).mapErr((0, casting_error_js_1.updateError)({ code: types_js_1.ERR_INVALID_KEY, path }));
if (keyResult.isErr)
return keyResult;
const valueResult = valueCaster(v, [...path, String(k)]);
if (valueResult.isErr)
return valueResult;
result[keyResult.value] = valueResult.value;
}
return (0, resultage_1.ok)(result);
};
const parse = (keyCaster, valueCaster) => (value, path) => {
const result = {};
const keys = (0, tools_js_1.propertyKeys)(value);
const errors = [];
for (let i = 0; i < keys.length; i += 1) {
const k = keys[i];
const v = value[k];
// it is not expected that keyCaster.parse will return more then one error
// so we can call keyCaster() instead of keyCaster.parse()
const keyResult = keyCaster(k, path).mapErr((0, casting_error_js_1.updateError)({ code: types_js_1.ERR_INVALID_KEY, path }));
if (keyResult.isErr) {
errors.push(keyResult.error);
continue;
}
const valueResult = valueCaster.parse(v, [...path, String(k)]);
if (valueResult.isErr) {
errors.push(...valueResult.error);
continue;
}
result[keyResult.value] = valueResult.value;
}
return errors.length === 0 ? (0, resultage_1.ok)(result) : (0, resultage_1.err)(errors);
};
const record = (keyCaster, valueCaster, name = `Record<${keyCaster.name}, ${valueCaster.name}>`) => (0, engine_js_1.fromGuardAndTransform)((value) => (0, predicates_js_1.isObject)(value), transform(keyCaster, valueCaster), name, types_js_1.ERR_INVALID_VALUE_TYPE, parse(keyCaster, valueCaster));
exports.record = record;