cbon
Version:
Common Bracket Object Notation
58 lines (57 loc) • 1.65 kB
JavaScript
import { Block, Arr, Str, Num, Bool, Null, Comma } from "./ast";
import { doRecursive, doRecursiveAsync } from "./recursive";
export function toJsObj(doc, config = { async: false }) {
var _a;
return ((_a = config) === null || _a === void 0 ? void 0 : _a.async) ? doRecursiveAsync(root, doc) : doRecursive(root, doc);
}
function* root(ctx, doc) {
const cs = [];
for (const u of doc.items) {
if (u instanceof Block) {
cs.push(yield ctx.call(block, u));
}
else if (u instanceof Arr) {
cs.push(yield ctx.call(arr, u));
}
}
return cs;
}
function* unit(ctx, u) {
if (u instanceof Block)
return yield ctx.call(block, u);
else if (u instanceof Arr)
return yield ctx.call(arr, u);
else if (u instanceof Num)
return u.val;
else if (u instanceof Str)
return u.val;
else if (u instanceof Bool)
return u.val;
else if (u instanceof Null)
return null;
else
return undefined;
}
function key(k) {
return k.key instanceof Str ? k.key.val : k.key;
}
function* block(ctx, b) {
const kvs = [];
for (const kv of b.items) {
if (kv instanceof 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;
}