1package json23type NodeBuilder struct {4 node *Node5}67func Builder() *NodeBuilder {8 return &NodeBuilder{node: ObjectNode("", nil)}9}1011func (b *NodeBuilder) WriteString(key, value string) *NodeBuilder {12 b.node.AppendObject(key, StringNode("", value))13 return b14}1516func (b *NodeBuilder) WriteNumber(key string, value float64) *NodeBuilder {17 b.node.AppendObject(key, NumberNode("", value))18 return b19}2021func (b *NodeBuilder) WriteBool(key string, value bool) *NodeBuilder {22 b.node.AppendObject(key, BoolNode("", value))23 return b24}2526func (b *NodeBuilder) WriteNull(key string) *NodeBuilder {27 b.node.AppendObject(key, NullNode(""))28 return b29}3031func (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 b36}3738func (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 b43}4445func (b *NodeBuilder) Node() *Node {46 return b.node47}4849type ArrayBuilder struct {50 nodes []*Node51}5253func (ab *ArrayBuilder) WriteString(value string) *ArrayBuilder {54 ab.nodes = append(ab.nodes, StringNode("", value))55 return ab56}5758func (ab *ArrayBuilder) WriteNumber(value float64) *ArrayBuilder {59 ab.nodes = append(ab.nodes, NumberNode("", value))60 return ab61}6263func (ab *ArrayBuilder) WriteInt(value int) *ArrayBuilder {64 return ab.WriteNumber(float64(value))65}6667func (ab *ArrayBuilder) WriteBool(value bool) *ArrayBuilder {68 ab.nodes = append(ab.nodes, BoolNode("", value))69 return ab70}7172func (ab *ArrayBuilder) WriteNull() *ArrayBuilder {73 ab.nodes = append(ab.nodes, NullNode(""))74 return ab75}7677func (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 ab82}8384func (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 ab89}90Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.