jsonw.go

 1package graphql
 2
 3import (
 4	"io"
 5	"strconv"
 6)
 7
 8var nullLit = []byte(`null`)
 9var trueLit = []byte(`true`)
10var falseLit = []byte(`false`)
11var openBrace = []byte(`{`)
12var closeBrace = []byte(`}`)
13var openBracket = []byte(`[`)
14var closeBracket = []byte(`]`)
15var colon = []byte(`:`)
16var comma = []byte(`,`)
17
18var Null = &lit{nullLit}
19var True = &lit{trueLit}
20var False = &lit{falseLit}
21
22type Marshaler interface {
23	MarshalGQL(w io.Writer)
24}
25
26type Unmarshaler interface {
27	UnmarshalGQL(v interface{}) error
28}
29
30type OrderedMap struct {
31	Keys   []string
32	Values []Marshaler
33}
34
35type WriterFunc func(writer io.Writer)
36
37func (f WriterFunc) MarshalGQL(w io.Writer) {
38	f(w)
39}
40
41func NewOrderedMap(len int) *OrderedMap {
42	return &OrderedMap{
43		Keys:   make([]string, len),
44		Values: make([]Marshaler, len),
45	}
46}
47
48func (m *OrderedMap) Add(key string, value Marshaler) {
49	m.Keys = append(m.Keys, key)
50	m.Values = append(m.Values, value)
51}
52
53func (m *OrderedMap) MarshalGQL(writer io.Writer) {
54	writer.Write(openBrace)
55	for i, key := range m.Keys {
56		if i != 0 {
57			writer.Write(comma)
58		}
59		io.WriteString(writer, strconv.Quote(key))
60		writer.Write(colon)
61		m.Values[i].MarshalGQL(writer)
62	}
63	writer.Write(closeBrace)
64}
65
66type Array []Marshaler
67
68func (a Array) MarshalGQL(writer io.Writer) {
69	writer.Write(openBracket)
70	for i, val := range a {
71		if i != 0 {
72			writer.Write(comma)
73		}
74		val.MarshalGQL(writer)
75	}
76	writer.Write(closeBracket)
77}
78
79type lit struct{ b []byte }
80
81func (l lit) MarshalGQL(w io.Writer) {
82	w.Write(l.b)
83}