Skip to content

Commit 8f5605a

Browse files
committed
refactor directives
1 parent faf5384 commit 8f5605a

File tree

4 files changed

+50
-55
lines changed

4 files changed

+50
-55
lines changed

internal/common/directive.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package common
2+
3+
import (
4+
"github.com/neelance/graphql-go/internal/lexer"
5+
)
6+
7+
type Directive struct {
8+
Name string
9+
Args map[string]interface{}
10+
}
11+
12+
func ParseDirectives(l *lexer.Lexer) map[string]*Directive {
13+
directives := make(map[string]*Directive)
14+
for l.Peek() == '@' {
15+
l.ConsumeToken('@')
16+
name := l.ConsumeIdent()
17+
var args map[string]interface{}
18+
if l.Peek() == '(' {
19+
args = ParseArguments(l)
20+
}
21+
directives[name] = &Directive{Name: name, Args: args}
22+
}
23+
return directives
24+
}

internal/common/values.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,19 @@ func ParseInputValue(l *lexer.Lexer) *InputValue {
3333

3434
type Variable string
3535

36+
func ParseArguments(l *lexer.Lexer) map[string]interface{} {
37+
args := make(map[string]interface{})
38+
l.ConsumeToken('(')
39+
for l.Peek() != ')' {
40+
name := l.ConsumeIdent()
41+
l.ConsumeToken(':')
42+
value := ParseValue(l, false)
43+
args[name] = value
44+
}
45+
l.ConsumeToken(')')
46+
return args
47+
}
48+
3649
func ParseValue(l *lexer.Lexer, constOnly bool) interface{} {
3750
switch l.Peek() {
3851
case '$':

internal/exec/exec.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -671,10 +671,10 @@ type typeAssertExec struct {
671671
typeExec iExec
672672
}
673673

674-
func skipByDirective(r *request, d map[string]*query.Directive) bool {
674+
func skipByDirective(r *request, d map[string]*common.Directive) bool {
675675
if skip, ok := d["skip"]; ok {
676676
p := valuePacker{valueType: boolType}
677-
v, err := p.pack(r, r.resolveVar(skip.Arguments["if"]))
677+
v, err := p.pack(r, r.resolveVar(skip.Args["if"]))
678678
if err != nil {
679679
r.addError(errors.Errorf("%s", err))
680680
}
@@ -685,7 +685,7 @@ func skipByDirective(r *request, d map[string]*query.Directive) bool {
685685

686686
if include, ok := d["include"]; ok {
687687
p := valuePacker{valueType: boolType}
688-
v, err := p.pack(r, r.resolveVar(include.Arguments["if"]))
688+
v, err := p.pack(r, r.resolveVar(include.Args["if"]))
689689
if err != nil {
690690
r.addError(errors.Errorf("%s", err))
691691
}

internal/query/query.go

Lines changed: 10 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -51,23 +51,18 @@ type Field struct {
5151
Alias string
5252
Name string
5353
Arguments map[string]interface{}
54-
Directives map[string]*Directive
54+
Directives map[string]*common.Directive
5555
SelSet *SelectionSet
5656
}
5757

58-
type Directive struct {
59-
Name string
60-
Arguments map[string]interface{}
61-
}
62-
6358
type FragmentSpread struct {
6459
Name string
65-
Directives map[string]*Directive
60+
Directives map[string]*common.Directive
6661
}
6762

6863
type InlineFragment struct {
6964
Fragment
70-
Directives map[string]*Directive
65+
Directives map[string]*common.Directive
7166
}
7267

7368
func (Field) isSelection() {}
@@ -180,77 +175,40 @@ func parseSelection(l *lexer.Lexer) Selection {
180175
}
181176

182177
func parseField(l *lexer.Lexer) *Field {
183-
f := &Field{
184-
Directives: make(map[string]*Directive),
185-
}
178+
f := &Field{}
186179
f.Alias = l.ConsumeIdent()
187180
f.Name = f.Alias
188181
if l.Peek() == ':' {
189182
l.ConsumeToken(':')
190183
f.Name = l.ConsumeIdent()
191184
}
192185
if l.Peek() == '(' {
193-
f.Arguments = parseArguments(l)
194-
}
195-
for l.Peek() == '@' {
196-
d := parseDirective(l)
197-
f.Directives[d.Name] = d
186+
f.Arguments = common.ParseArguments(l)
198187
}
188+
f.Directives = common.ParseDirectives(l)
199189
if l.Peek() == '{' {
200190
f.SelSet = parseSelectionSet(l)
201191
}
202192
return f
203193
}
204194

205-
func parseArguments(l *lexer.Lexer) map[string]interface{} {
206-
args := make(map[string]interface{})
207-
l.ConsumeToken('(')
208-
for l.Peek() != ')' {
209-
name := l.ConsumeIdent()
210-
l.ConsumeToken(':')
211-
value := common.ParseValue(l, false)
212-
args[name] = value
213-
}
214-
l.ConsumeToken(')')
215-
return args
216-
}
217-
218-
func parseDirective(l *lexer.Lexer) *Directive {
219-
d := &Directive{}
220-
l.ConsumeToken('@')
221-
d.Name = l.ConsumeIdent()
222-
if l.Peek() == '(' {
223-
d.Arguments = parseArguments(l)
224-
}
225-
return d
226-
}
227-
228195
func parseSpread(l *lexer.Lexer) Selection {
229196
l.ConsumeToken('.')
230197
l.ConsumeToken('.')
231198
l.ConsumeToken('.')
232199
ident := l.ConsumeIdent()
233200

234201
if ident == "on" {
235-
f := &InlineFragment{
236-
Directives: make(map[string]*Directive),
237-
}
202+
f := &InlineFragment{}
238203
f.On = l.ConsumeIdent()
239-
for l.Peek() == '@' {
240-
d := parseDirective(l)
241-
f.Directives[d.Name] = d
242-
}
204+
f.Directives = common.ParseDirectives(l)
243205
f.SelSet = parseSelectionSet(l)
244206
return f
245207
}
246208

247209
fs := &FragmentSpread{
248-
Directives: make(map[string]*Directive),
249-
Name: ident,
250-
}
251-
for l.Peek() == '@' {
252-
d := parseDirective(l)
253-
fs.Directives[d.Name] = d
210+
Name: ident,
254211
}
212+
fs.Directives = common.ParseDirectives(l)
255213
return fs
256214
}

0 commit comments

Comments
 (0)