UNPKG

castage

Version:

A type-safe library for dynamic object casting and ensuring type consistency in JavaScript/TypeScript.

51 lines (50 loc) 2.36 kB
"use strict"; 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;