github.com/niko0xdev/gqlgen@v0.17.55-0.20240120102243-2ecff98c3e37/graphql/jsonw.go (about) 1 package graphql 2 3 import ( 4 "context" 5 "io" 6 ) 7 8 var ( 9 nullLit = []byte(`null`) 10 trueLit = []byte(`true`) 11 falseLit = []byte(`false`) 12 openBrace = []byte(`{`) 13 closeBrace = []byte(`}`) 14 openBracket = []byte(`[`) 15 closeBracket = []byte(`]`) 16 colon = []byte(`:`) 17 comma = []byte(`,`) 18 ) 19 20 var ( 21 Null = &lit{nullLit} 22 True = &lit{trueLit} 23 False = &lit{falseLit} 24 ) 25 26 type Marshaler interface { 27 MarshalGQL(w io.Writer) 28 } 29 30 type Unmarshaler interface { 31 UnmarshalGQL(v interface{}) error 32 } 33 34 type ContextMarshaler interface { 35 MarshalGQLContext(ctx context.Context, w io.Writer) error 36 } 37 38 type ContextUnmarshaler interface { 39 UnmarshalGQLContext(ctx context.Context, v interface{}) error 40 } 41 42 type contextMarshalerAdapter struct { 43 Context context.Context 44 ContextMarshaler 45 } 46 47 func WrapContextMarshaler(ctx context.Context, m ContextMarshaler) Marshaler { 48 return contextMarshalerAdapter{Context: ctx, ContextMarshaler: m} 49 } 50 51 func (a contextMarshalerAdapter) MarshalGQL(w io.Writer) { 52 err := a.MarshalGQLContext(a.Context, w) 53 if err != nil { 54 AddError(a.Context, err) 55 Null.MarshalGQL(w) 56 } 57 } 58 59 type WriterFunc func(writer io.Writer) 60 61 func (f WriterFunc) MarshalGQL(w io.Writer) { 62 f(w) 63 } 64 65 type ContextWriterFunc func(ctx context.Context, writer io.Writer) error 66 67 func (f ContextWriterFunc) MarshalGQLContext(ctx context.Context, w io.Writer) error { 68 return f(ctx, w) 69 } 70 71 type Array []Marshaler 72 73 func (a Array) MarshalGQL(writer io.Writer) { 74 writer.Write(openBracket) 75 for i, val := range a { 76 if i != 0 { 77 writer.Write(comma) 78 } 79 val.MarshalGQL(writer) 80 } 81 writer.Write(closeBracket) 82 } 83 84 type lit struct{ b []byte } 85 86 func (l lit) MarshalGQL(w io.Writer) { 87 w.Write(l.b) 88 } 89 90 func (l lit) MarshalGQLContext(ctx context.Context, w io.Writer) error { 91 w.Write(l.b) 92 return nil 93 }