UNPKG

cbon

Version:
61 lines (60 loc) 1.78 kB
"use strict"; 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; }