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}