11package gqlparser
22
3+ import "strconv"
4+
35type Operation string
46
57const (
@@ -132,19 +134,67 @@ type FragmentDefinition struct {
132134// Values
133135
134136type Value interface {
135- isValue ()
137+ Value (vars map [Variable ]interface {}) (interface {}, error )
138+ String () string
139+ }
140+
141+ func (v Variable ) Value (vars map [Variable ]interface {}) (interface {}, error ) {
142+ return vars [v ], nil
143+ }
144+ func (v IntValue ) Value (vars map [Variable ]interface {}) (interface {}, error ) {
145+ return strconv .ParseInt (string (v ), 10 , 64 )
146+ }
147+ func (v FloatValue ) Value (vars map [Variable ]interface {}) (interface {}, error ) {
148+ return strconv .ParseFloat (string (v ), 64 )
149+ }
150+ func (v StringValue ) Value (vars map [Variable ]interface {}) (interface {}, error ) {
151+ return string (v ), nil
152+ }
153+ func (v BlockValue ) Value (vars map [Variable ]interface {}) (interface {}, error ) {
154+ return string (v ), nil
155+ }
156+ func (v BooleanValue ) Value (vars map [Variable ]interface {}) (interface {}, error ) {
157+ return bool (v ), nil
158+ }
159+ func (v NullValue ) Value (vars map [Variable ]interface {}) (interface {}, error ) {
160+ return nil , nil
161+ }
162+ func (v EnumValue ) Value (vars map [Variable ]interface {}) (interface {}, error ) {
163+ return string (v ), nil
164+ }
165+ func (v ListValue ) Value (vars map [Variable ]interface {}) (interface {}, error ) {
166+ var val []interface {}
167+ for _ , elem := range v {
168+ elemVal , err := elem .Value (vars )
169+ if err != nil {
170+ return val , err
171+ }
172+ val = append (val , elemVal )
173+ }
174+ return val , nil
175+ }
176+ func (v ObjectValue ) Value (vars map [Variable ]interface {}) (interface {}, error ) {
177+ val := map [string ]interface {}{}
178+ for _ , elem := range v {
179+ elemVal , err := elem .Value .Value (vars )
180+ if err != nil {
181+ return val , err
182+ }
183+ val [elem .Name ] = elemVal
184+ }
185+ return val , nil
136186}
137187
138- func (Variable ) isValue () { }
139- func (IntValue ) isValue () { }
140- func (FloatValue ) isValue () { }
141- func (StringValue ) isValue () { }
142- func (BlockValue ) isValue () { }
143- func (BooleanValue ) isValue () { }
144- func (NullValue ) isValue () { }
145- func (EnumValue ) isValue () { }
146- func (ListValue ) isValue () { }
147- func (ObjectValue ) isValue () { }
188+ func (v Variable ) String () string { return string ( v ) }
189+ func (v IntValue ) String () string { return string ( v ) }
190+ func (v FloatValue ) String () string { return string ( v ) }
191+ func (v StringValue ) String () string { return strconv . Quote ( string ( v )) }
192+ func (v BlockValue ) String () string { return strconv . Quote ( string ( v )) }
193+ func (v BooleanValue ) String () string { return strconv . FormatBool ( bool ( v )) }
194+ func (v NullValue ) String () string { return "null" }
195+ func (v EnumValue ) String () string { return string ( v ) }
196+ func (v ListValue ) String () string { return "list" }
197+ func (v ObjectValue ) String () string { return "object" }
148198
149199type IntValue string
150200type FloatValue string
@@ -161,6 +211,15 @@ type ObjectField struct {
161211 Value Value
162212}
163213
214+ func (o ObjectValue ) Find (name string ) Value {
215+ for _ , f := range o {
216+ if f .Name == name {
217+ return f .Value
218+ }
219+ }
220+ return nil
221+ }
222+
164223// Directives
165224
166225type Directive struct {
@@ -173,6 +232,7 @@ type Directive struct {
173232type Type interface {
174233 Name () string
175234 String () string
235+ IsRequired () bool
176236}
177237
178238func (t NamedType ) Name () string { return string (t ) }
@@ -183,6 +243,10 @@ func (t NamedType) String() string { return string(t) }
183243func (t ListType ) String () string { return "[" + t .Type .Name () + "]" }
184244func (t NonNullType ) String () string { return t .Type .Name () + "!" }
185245
246+ func (t NamedType ) IsRequired () bool { return false }
247+ func (t ListType ) IsRequired () bool { return false }
248+ func (t NonNullType ) IsRequired () bool { return true }
249+
186250type NamedType string
187251
188252type ListType struct {
@@ -243,6 +307,15 @@ func (d *Definition) Field(name string) *FieldDefinition {
243307 return nil
244308}
245309
310+ func (d * Definition ) EnumValue (name string ) * EnumValueDefinition {
311+ for _ , e := range d .Values {
312+ if e .Name == name {
313+ return & e
314+ }
315+ }
316+ return nil
317+ }
318+
246319func (d * Definition ) IsLeafType () bool {
247320 return d .Kind == Enum || d .Kind == Scalar
248321}
@@ -255,6 +328,15 @@ func (d *Definition) IsCompositeType() bool {
255328 return d .Kind == Object || d .Kind == Interface || d .Kind == Union
256329}
257330
331+ func (d * Definition ) OneOf (types ... string ) bool {
332+ for _ , t := range types {
333+ if d .Name == t {
334+ return true
335+ }
336+ }
337+ return false
338+ }
339+
258340type FieldDefinition struct {
259341 Description string
260342 Name string
0 commit comments