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}