domain/architecture/system/release/plugin/json.bend

near-v-framework@0.6.0.0 · 65 lines · 0 definitions

1import Base
2import 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
6def 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
13def 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.
17def 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
24def 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
31def 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
38def 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.
46def 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
53def 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
60def texts(xs: List<&2, String>) -> Json.Val:
61  Json.Arr{strs(xs)}
62
63def 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