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