1 import Base 2 import bend-net-json@0.3.0.0/json.bend as Json 3 4 # Building a plugin's JSON: optional keys are left out when absent. 5 6 def with.go(kvs: List<&2, Sigma<&2, &2, String, _ => Json.Val>>, m: Map<&2, Json.Val>) -> Map<&2, Json.Val>: 7 match kvs: 8 case []: 9 m 10 case (k, v) <> rest: 11 with.go(rest, Map.set(&2, Json.Val, m, k, v)) 12 13 def obj(kvs: List<&2, Sigma<&2, &2, String, _ => Json.Val>>) -> Json.Val: 14 Json.Obj{with.go(kvs, Map.new(&2, Json.Val))} 15 16 # A key, or nothing when its value is absent. 17 def opt(+k: String, m: Maybe<&2, Json.Val>) -> List<&2, Sigma<&2, &2, String, _ => Json.Val>>: 18 match m: 19 case Some{v}: 20 [(k, v)] 21 case None{}: 22 [] 23 24 def text(m: Maybe<&2, String>) -> Maybe<&2, Json.Val>: 25 match m: 26 case Some{s}: 27 Some{Json.Str{s}} 28 case None{}: 29 None{} 30 31 def number(m: Maybe<&2, Nat>) -> Maybe<&2, Json.Val>: 32 match m: 33 case Some{n}: 34 Some{Json.Num{Nat.show(n)}} 35 case None{}: 36 None{} 37 38 def flag(m: Maybe<&2, Bool>) -> Maybe<&2, Json.Val>: 39 match m: 40 case Some{b}: 41 Some{Json.Flag{b}} 42 case None{}: 43 None{} 44 45 # A key that is true, or nothing: false is every flag's default. 46 def when_true(+k: String, b: Bool) -> List<&2, Sigma<&2, &2, String, _ => Json.Val>>: 47 match b: 48 case True{}: 49 [(k, Json.Flag{True{}})] 50 case False{}: 51 [] 52 53 def strs(xs: List<&2, String>) -> List<&2, Json.Val>: 54 match xs: 55 case []: 56 [] 57 case x <> rest: 58 Json.Str{x} <> strs(rest) 59 60 def texts(xs: List<&2, String>) -> Json.Val: 61 Json.Arr{strs(xs)} 62 63 def cat(xss: List<&2, List<&2, Sigma<&2, &2, String, _ => Json.Val>>>) -> Json.Val: 64 obj(List.concat(&2, Sigma<&2, &2, String, _ => Json.Val>, xss)) 65