cbon
Version:
Common Bracket Object Notation
61 lines (60 loc) • 1.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const ast_1 = require("./ast");
const recursive_1 = require("./recursive");
function toJsObj(doc, config = { async: false }) {
var _a;
return ((_a = config) === null || _a === void 0 ? void 0 : _a.async) ? recursive_1.doRecursiveAsync(root, doc) : recursive_1.doRecursive(root, doc);
}
exports.toJsObj = toJsObj;
function* root(ctx, doc) {
const cs = [];
for (const u of doc.items) {
if (u instanceof ast_1.Block) {
cs.push(yield ctx.call(block, u));
}
else if (u instanceof ast_1.Arr) {
cs.push(yield ctx.call(arr, u));
}
}
return cs;
}
function* unit(ctx, u) {
if (u instanceof ast_1.Block)
return yield ctx.call(block, u);
else if (u instanceof ast_1.Arr)
return yield ctx.call(arr, u);
else if (u instanceof ast_1.Num)
return u.val;
else if (u instanceof ast_1.Str)
return u.val;
else if (u instanceof ast_1.Bool)
return u.val;
else if (u instanceof ast_1.Null)
return null;
else
return undefined;
}
function key(k) {
return k.key instanceof ast_1.Str ? k.key.val : k.key;
}
function* block(ctx, b) {
const kvs = [];
for (const kv of b.items) {
if (kv instanceof ast_1.Comma)
continue;
const v = yield ctx.call(unit, kv.val);
if (v !== undefined)
kvs.push([key(kv.key), v]);
}
return Object.fromEntries(kvs);
}
function* arr(ctx, a) {
const ars = [];
for (const u of a.items) {
const v = yield ctx.call(unit, u);
if (v !== undefined)
ars.push(v);
}
return ars;
}