confinode
Version:
Node application configuration reader
60 lines • 2.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const ConfinodeError_1 = require("../../ConfinodeError");
const ConfinodeResult_1 = require("../../ConfinodeResult");
const messages_1 = require("../../messages");
const utils_1 = require("../../utils");
const ConfigDescription_1 = require("../ConfigDescription");
/**
* Description of an array.
*/
class ArrayDescription {
/**
* Create the array description.
*
* @param description - The description to replicate for each array item.
*/
constructor(description) {
this.description = description;
}
parse(data, context) {
const { fileName, keyName, parent, final } = context;
if (Array.isArray(data)) {
return this.mergeArray(data, context);
}
else if (data !== undefined && data !== null) {
throw new ConfinodeError_1.default('expected', keyName, fileName, new messages_1.Message(messages_1.Level.Error, 'expectedArray'));
}
else if (data === undefined && parent) {
return parent;
}
else if (!final) {
return undefined;
}
else {
throw new ConfinodeError_1.default('missingMandatory', keyName);
}
}
/**
* Parse and merge the array content. The default behavior is to concatenate the child nodes to the parsed
* parent ones.
*
* @param data - The array to parse and merge.
* @param context - The parsing context.
* @returns The parsed and merged array.
*/
mergeArray(data, context) {
var _a, _b;
ConfigDescription_1.assertHasParentResult(context);
const parent = (_b = (_a = context.parent) === null || _a === void 0 ? void 0 : _a.children) !== null && _b !== void 0 ? _b : [];
return new ConfinodeResult_1.ParentResult(parent.concat(data
.map((item, index) => ConfigDescription_1.asDescription(this.description).parse(item, {
...context,
keyName: `${context.keyName}[${index}]`,
parent: undefined,
}))
.filter(utils_1.isExisting)));
}
}
exports.default = ArrayDescription;
//# sourceMappingURL=ArrayDescription.js.map