ref: 94443daf8e248e65afc8d3f17f26efea22748b51
dir: /module/json.m/
JSON: module
{
PATH: con "/dis/lib/json.dis";
JValue: adt {
pick{
Object =>
mem: cyclic list of (string, ref JValue);
Array =>
a: cyclic array of ref JValue;
String =>
s: string;
Int =>
value: big; # could use IPint? # just use Number (as string)
Real =>
value: real;
True or False or Null =>
}
isarray: fn(o: self ref JValue): int;
isfalse: fn(o: self ref JValue): int;
isint: fn(o: self ref JValue): int;
isnull: fn(o: self ref JValue): int;
isnumber: fn(o: self ref JValue): int;
isobject: fn(o: self ref JValue): int;
isreal: fn(o: self ref JValue): int;
isstring: fn(o: self ref JValue): int;
istrue: fn(o: self ref JValue): int;
copy: fn(o: self ref JValue): ref JValue;
eq: fn(a: self ref JValue, b: ref JValue): int;
get: fn(a: self ref JValue, n: string): ref JValue;
set: fn(a: self ref JValue, mem: string, value: ref JValue);
text: fn(a: self ref JValue): string;
};
init: fn(bufio: Bufio);
readjson: fn(buf: ref Bufio->Iobuf): (ref JValue, string);
writejson: fn(buf: ref Bufio->Iobuf, val: ref JValue): int;
# shorthand?
jvarray: fn(a: array of ref JValue): ref JValue.Array;
jvbig: fn(b: big): ref JValue.Int;
jvfalse: fn(): ref JValue.False;
jvint: fn(i: int): ref JValue.Int;
jvnull: fn(): ref JValue.Null;
jvobject: fn(m: list of (string, ref JValue)): ref JValue.Object;
jvreal: fn(r: real): ref JValue.Real;
jvstring: fn(s: string): ref JValue.String;
jvtrue: fn(): ref JValue.True;
};