2021-10-11 10:56:53 +00:00
|
|
|
import { Annotated, Bytes, Set, Dictionary, Fold, fold, Record, Tuple, Value, stringify, Embedded } from "@preserves/core";
|
2021-03-23 10:36:55 +00:00
|
|
|
import { brackets, Item, parens, seq } from "./block";
|
2021-04-24 21:49:37 +00:00
|
|
|
import * as M from '../meta';
|
2021-03-23 10:36:55 +00:00
|
|
|
|
2021-10-11 10:56:53 +00:00
|
|
|
export function sourceCodeFor(v: Value<M.InputEmbedded>): Item {
|
2021-03-23 10:36:55 +00:00
|
|
|
return fold(v, {
|
|
|
|
boolean(b: boolean): Item { return b.toString(); },
|
|
|
|
single(f: number): Item { return f.toString(); },
|
|
|
|
double(f: number): Item { return f.toString(); },
|
|
|
|
integer(i: number): Item { return i.toString(); },
|
|
|
|
string(s: string): Item { return JSON.stringify(s); },
|
|
|
|
bytes(b: Bytes): Item {
|
|
|
|
return seq(`Uint8Array.from(`, brackets(... Array.from(b).map(b => b.toString())), `)`);
|
|
|
|
},
|
2021-12-09 17:36:45 +00:00
|
|
|
symbol(s: symbol): Item { return `_.Symbol.for(${JSON.stringify(s.description!)})`; },
|
2021-03-23 10:36:55 +00:00
|
|
|
|
2021-10-11 10:56:53 +00:00
|
|
|
record(r: Record<Value<M.InputEmbedded>, Tuple<Value<M.InputEmbedded>>, M.InputEmbedded>, k: Fold<M.InputEmbedded, Item>): Item {
|
|
|
|
return seq(`_.Record<_.Value<_embedded>, _.Tuple<_.Value<_embedded>>, _embedded>`, parens(k(r.label), brackets(... r.map(k))));
|
2021-03-23 10:36:55 +00:00
|
|
|
},
|
2021-10-11 10:56:53 +00:00
|
|
|
array(a: Array<Value<M.InputEmbedded>>, k: Fold<M.InputEmbedded, Item>): Item {
|
2021-03-23 10:36:55 +00:00
|
|
|
return brackets(... a.map(k));
|
|
|
|
},
|
2021-10-11 10:56:53 +00:00
|
|
|
set(s: Set<M.InputEmbedded>, k: Fold<M.InputEmbedded, Item>): Item {
|
|
|
|
return seq('new _.Set<_.Value<_embedded>>', parens(brackets(... Array.from(s).map(k))));
|
2021-03-23 10:36:55 +00:00
|
|
|
},
|
2021-10-11 10:56:53 +00:00
|
|
|
dictionary(d: Dictionary<M.InputEmbedded>, k: Fold<M.InputEmbedded, Item>): Item {
|
2021-05-17 12:54:06 +00:00
|
|
|
return seq('new _.Dictionary<_embedded>', parens(brackets(... Array.from(d).map(([kk,vv]) =>
|
2021-03-23 10:36:55 +00:00
|
|
|
brackets(k(kk), k(vv))))));
|
|
|
|
},
|
|
|
|
|
2021-10-11 10:56:53 +00:00
|
|
|
annotated(a: Annotated<M.InputEmbedded>, k: Fold<M.InputEmbedded, Item>): Item {
|
2021-05-17 12:54:06 +00:00
|
|
|
return seq('_.annotate<_embedded>', parens(k(a.item), ... a.annotations.map(k)));
|
2021-03-23 10:36:55 +00:00
|
|
|
},
|
|
|
|
|
2021-10-11 10:56:53 +00:00
|
|
|
embedded(t: Embedded<M.InputEmbedded>, _k: Fold<M.InputEmbedded, Item>): Item {
|
2021-05-17 12:54:06 +00:00
|
|
|
throw new Error(`Cannot emit source code for construction of embedded ${stringify(t)}`);
|
2021-03-23 10:36:55 +00:00
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|