builder.gno
2.19 Kb ยท 89 lines
1package json
2
3type NodeBuilder struct {
4 node *Node
5}
6
7func Builder() *NodeBuilder {
8 return &NodeBuilder{node: ObjectNode("", nil)}
9}
10
11func (b *NodeBuilder) WriteString(key, value string) *NodeBuilder {
12 b.node.AppendObject(key, StringNode("", value))
13 return b
14}
15
16func (b *NodeBuilder) WriteNumber(key string, value float64) *NodeBuilder {
17 b.node.AppendObject(key, NumberNode("", value))
18 return b
19}
20
21func (b *NodeBuilder) WriteBool(key string, value bool) *NodeBuilder {
22 b.node.AppendObject(key, BoolNode("", value))
23 return b
24}
25
26func (b *NodeBuilder) WriteNull(key string) *NodeBuilder {
27 b.node.AppendObject(key, NullNode(""))
28 return b
29}
30
31func (b *NodeBuilder) WriteObject(key string, fn func(*NodeBuilder)) *NodeBuilder {
32 nestedBuilder := &NodeBuilder{node: ObjectNode("", nil)}
33 fn(nestedBuilder)
34 b.node.AppendObject(key, nestedBuilder.node)
35 return b
36}
37
38func (b *NodeBuilder) WriteArray(key string, fn func(*ArrayBuilder)) *NodeBuilder {
39 arrayBuilder := &ArrayBuilder{nodes: []*Node{}}
40 fn(arrayBuilder)
41 b.node.AppendObject(key, ArrayNode("", arrayBuilder.nodes))
42 return b
43}
44
45func (b *NodeBuilder) Node() *Node {
46 return b.node
47}
48
49type ArrayBuilder struct {
50 nodes []*Node
51}
52
53func (ab *ArrayBuilder) WriteString(value string) *ArrayBuilder {
54 ab.nodes = append(ab.nodes, StringNode("", value))
55 return ab
56}
57
58func (ab *ArrayBuilder) WriteNumber(value float64) *ArrayBuilder {
59 ab.nodes = append(ab.nodes, NumberNode("", value))
60 return ab
61}
62
63func (ab *ArrayBuilder) WriteInt(value int) *ArrayBuilder {
64 return ab.WriteNumber(float64(value))
65}
66
67func (ab *ArrayBuilder) WriteBool(value bool) *ArrayBuilder {
68 ab.nodes = append(ab.nodes, BoolNode("", value))
69 return ab
70}
71
72func (ab *ArrayBuilder) WriteNull() *ArrayBuilder {
73 ab.nodes = append(ab.nodes, NullNode(""))
74 return ab
75}
76
77func (ab *ArrayBuilder) WriteObject(fn func(*NodeBuilder)) *ArrayBuilder {
78 nestedBuilder := &NodeBuilder{node: ObjectNode("", nil)}
79 fn(nestedBuilder)
80 ab.nodes = append(ab.nodes, nestedBuilder.node)
81 return ab
82}
83
84func (ab *ArrayBuilder) WriteArray(fn func(*ArrayBuilder)) *ArrayBuilder {
85 nestedArrayBuilder := &ArrayBuilder{nodes: []*Node{}}
86 fn(nestedArrayBuilder)
87 ab.nodes = append(ab.nodes, ArrayNode("", nestedArrayBuilder.nodes))
88 return ab
89}