xref: /inferno-os/module/json.m (revision ee1a8f4a2601560b3563fa4bd92075ac2883fb06)
1*ee1a8f4aSCharles.ForsythJSON: module
2*ee1a8f4aSCharles.Forsyth{
3*ee1a8f4aSCharles.Forsyth	PATH:	con "/dis/lib/json.dis";
4*ee1a8f4aSCharles.Forsyth
5*ee1a8f4aSCharles.Forsyth	JValue: adt {
6*ee1a8f4aSCharles.Forsyth		pick{
7*ee1a8f4aSCharles.Forsyth		Object =>
8*ee1a8f4aSCharles.Forsyth			mem: cyclic list of (string, ref JValue);
9*ee1a8f4aSCharles.Forsyth		Array =>
10*ee1a8f4aSCharles.Forsyth			a: cyclic array of ref JValue;
11*ee1a8f4aSCharles.Forsyth		String =>
12*ee1a8f4aSCharles.Forsyth			s: string;
13*ee1a8f4aSCharles.Forsyth		Int =>
14*ee1a8f4aSCharles.Forsyth			value:	big;	# could use IPint?	# just use Number (as string)
15*ee1a8f4aSCharles.Forsyth		Real =>
16*ee1a8f4aSCharles.Forsyth			value:	real;
17*ee1a8f4aSCharles.Forsyth		True or False or Null =>
18*ee1a8f4aSCharles.Forsyth		}
19*ee1a8f4aSCharles.Forsyth
20*ee1a8f4aSCharles.Forsyth		isarray:	fn(o: self ref JValue): int;
21*ee1a8f4aSCharles.Forsyth		isfalse:	fn(o: self ref JValue): int;
22*ee1a8f4aSCharles.Forsyth		isint:		fn(o: self ref JValue): int;
23*ee1a8f4aSCharles.Forsyth		isnull:	fn(o: self ref JValue): int;
24*ee1a8f4aSCharles.Forsyth		isnumber: fn(o: self ref JValue): int;
25*ee1a8f4aSCharles.Forsyth		isobject:	fn(o: self ref JValue): int;
26*ee1a8f4aSCharles.Forsyth		isreal:	fn(o: self ref JValue): int;
27*ee1a8f4aSCharles.Forsyth		isstring:	fn(o: self ref JValue): int;
28*ee1a8f4aSCharles.Forsyth		istrue:	fn(o: self ref JValue): int;
29*ee1a8f4aSCharles.Forsyth		copy:	fn(o: self ref JValue): ref JValue;
30*ee1a8f4aSCharles.Forsyth		eq:	fn(a: self ref JValue, b: ref JValue): int;
31*ee1a8f4aSCharles.Forsyth		get:	fn(a: self ref JValue, n: string): ref JValue;
32*ee1a8f4aSCharles.Forsyth		set:	fn(a: self ref JValue, mem: string, value: ref JValue);
33*ee1a8f4aSCharles.Forsyth		text:	fn(a: self ref JValue): string;
34*ee1a8f4aSCharles.Forsyth	};
35*ee1a8f4aSCharles.Forsyth
36*ee1a8f4aSCharles.Forsyth	init:	fn(bufio: Bufio);
37*ee1a8f4aSCharles.Forsyth	readjson:	fn(buf: ref Bufio->Iobuf): (ref JValue, string);
38*ee1a8f4aSCharles.Forsyth	writejson:	fn(buf: ref Bufio->Iobuf, val: ref JValue): int;
39*ee1a8f4aSCharles.Forsyth
40*ee1a8f4aSCharles.Forsyth	# shorthand?
41*ee1a8f4aSCharles.Forsyth	jvarray:	fn(a: array of ref JValue): ref JValue.Array;
42*ee1a8f4aSCharles.Forsyth	jvbig:	fn(b: big): ref JValue.Int;
43*ee1a8f4aSCharles.Forsyth	jvfalse:	fn(): ref JValue.False;
44*ee1a8f4aSCharles.Forsyth	jvint:		fn(i: int): ref JValue.Int;
45*ee1a8f4aSCharles.Forsyth	jvnull:	fn(): ref JValue.Null;
46*ee1a8f4aSCharles.Forsyth	jvobject:	fn(m: list of (string, ref JValue)): ref JValue.Object;
47*ee1a8f4aSCharles.Forsyth	jvreal:	fn(r: real): ref JValue.Real;
48*ee1a8f4aSCharles.Forsyth	jvstring:	fn(s: string): ref JValue.String;
49*ee1a8f4aSCharles.Forsyth	jvtrue:	fn(): ref JValue.True;
50*ee1a8f4aSCharles.Forsyth};
51