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