Skip to content

Commit 2c3422d

Browse files
author
Ganesha Danu
committed
implement argument in selection
1 parent be05193 commit 2c3422d

File tree

7 files changed

+47
-17
lines changed

7 files changed

+47
-17
lines changed

parse_name.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ func (l *Lexer) parseName() (string, error) {
88
var name string
99
c, err := l.read()
1010
if !isAlphabet(c) {
11-
return "", errors.New("first character of an identifier Name have to be an alphabet")
11+
return "", errors.New("first character of an identifier Name have to be an alphabet: " + string(c))
1212
}
1313

1414
for (isAlphabet(c) || c == '_' || isNumber(c)) &&

parse_selection.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package gqlyzer
22

33
import (
44
"errors"
5+
"fmt"
56

67
"github.com/kumparan/gqlyzer/token"
78
)
@@ -17,9 +18,18 @@ func (l *Lexer) parseSelection() (newSelection token.Selection, err error) {
1718
}
1819
newSelection.Name = name
1920

21+
arguments, argErr := l.parseArgumentSet()
22+
if argErr == nil && len(arguments) > 0 {
23+
newSelection.Arguments = arguments
24+
fmt.Println("<><><><>", arguments)
25+
l.cursor++
26+
l.consumeWhitespace()
27+
}
28+
2029
subSelection, subErr := l.parseSelectionSet()
2130
if subErr == nil {
2231
newSelection.InnerSelection = subSelection
32+
2333
}
2434

2535
return
@@ -32,7 +42,6 @@ func (l *Lexer) parseSelectionSet() (set token.SelectionSet, err error) {
3242
if err != nil {
3343
return
3444
}
35-
3645
if c == '{' {
3746
l.push('{')
3847
l.pushFlush()
@@ -58,8 +67,8 @@ func (l *Lexer) parseSelectionSet() (set token.SelectionSet, err error) {
5867
set[selection.Name] = selection
5968
l.consumeWhitespace()
6069
c, err = l.read()
61-
}
6270

71+
}
6372
_, err = l.popFlush()
6473
if err != nil {
6574
return
@@ -69,9 +78,11 @@ func (l *Lexer) parseSelectionSet() (set token.SelectionSet, err error) {
6978
if err != nil {
7079
return
7180
}
81+
7282
} else {
7383
return token.SelectionSet{}, nil
7484
}
7585

86+
l.cursor++
7687
return
7788
}

parse_selection_args.go

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package gqlyzer
22

33
import (
44
"errors"
5-
"fmt"
65

76
"github.com/kumparan/gqlyzer/token"
87
)
@@ -24,11 +23,12 @@ func (l *Lexer) parseArgument() (argument token.Argument, err error) {
2423
err = errors.New("expected : but found " + string(c))
2524
return
2625
}
26+
2727
l.cursor++
2828
l.consumeWhitespace()
29+
c, err = l.read()
2930
if subArg, err := l.parseArgumentValueObject(); err == nil {
3031
argument.ObjectValue = subArg
31-
3232
} else if value, err := l.parseString(); err == nil {
3333
argument.Value = value
3434
} else {
@@ -40,9 +40,6 @@ func (l *Lexer) parseArgument() (argument token.Argument, err error) {
4040
argument.Value = value
4141
}
4242

43-
fmt.Println(">>>", argument)
44-
l.cursor++
45-
4643
return
4744
}
4845

@@ -53,10 +50,10 @@ func (l *Lexer) parseArgumentSet() (set token.ArgumentSet, err error) {
5350
if err != nil {
5451
return
5552
}
56-
5753
if c == '(' {
5854
l.push('(')
5955
l.pushFlush()
56+
l.push('\\')
6057
if err != nil {
6158
return
6259
}
@@ -80,7 +77,6 @@ func (l *Lexer) parseArgumentSet() (set token.ArgumentSet, err error) {
8077
l.consumeWhitespace()
8178
c, err = l.read()
8279
}
83-
8480
_, err = l.popFlush()
8581
if err != nil {
8682
return
@@ -116,7 +112,6 @@ func (l *Lexer) parseArgumentValueObject() (set token.ArgumentSet, err error) {
116112
l.consumeWhitespace()
117113
c, err = l.read()
118114
for err == nil && c != '}' {
119-
fmt.Println(string(c))
120115
if c == ',' {
121116
l.push(c)
122117
l.cursor++
@@ -130,10 +125,10 @@ func (l *Lexer) parseArgumentValueObject() (set token.ArgumentSet, err error) {
130125
return token.ArgumentSet{}, err
131126
}
132127
set[arg.Key] = arg
128+
l.cursor++
133129
l.consumeWhitespace()
134130
c, err = l.read()
135131
}
136-
fmt.Println("keluar")
137132
_, err = l.popFlush()
138133
if err != nil {
139134
return
@@ -143,12 +138,11 @@ func (l *Lexer) parseArgumentValueObject() (set token.ArgumentSet, err error) {
143138
if err != nil {
144139
return
145140
}
146-
147-
fmt.Println("ga error")
141+
l.cursor++
142+
l.consumeWhitespace()
148143
} else {
149144
return token.ArgumentSet{}, errors.New("argument is not an object")
150145
}
151146

152-
fmt.Println(">>> set:", set)
153147
return
154148
}

parse_selection_args_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
func TestParseArgument(t *testing.T) {
10-
t.Run("without string value", func(t *testing.T) {
10+
t.Run("with string value", func(t *testing.T) {
1111
l := Lexer{input: `SomeQuery: "helloworld"`}
1212
l.Reset()
1313
l.push('\\')
@@ -18,7 +18,7 @@ func TestParseArgument(t *testing.T) {
1818
assert.Equal(t, `"helloworld"`, s.Value)
1919
})
2020

21-
t.Run("without object value", func(t *testing.T) {
21+
t.Run("with object value", func(t *testing.T) {
2222
l := Lexer{input: `SomeQuery: {
2323
test: "helloworld",
2424
test2: "helloworld"

parse_selection_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,20 @@ func TestParseSelection(t *testing.T) {
2929
assert.Equal(t, "SomeQuery", s.Name)
3030
assert.Equal(t, "subQuery", s.InnerSelection["subQuery"].Name)
3131
})
32+
33+
t.Run("with arguments", func(t *testing.T) {
34+
l := Lexer{input: `SomeQuery(id: 123) {
35+
subQuery
36+
}`}
37+
l.Reset()
38+
l.push('\\')
39+
40+
s, err := l.parseSelection()
41+
assert.NoError(t, err)
42+
assert.Equal(t, "SomeQuery", s.Name)
43+
assert.Equal(t, "subQuery", s.InnerSelection["subQuery"].Name)
44+
assert.Equal(t, "id", s.Arguments["id"].Key)
45+
})
3246
}
3347

3448
func TestParseSelectionSet(t *testing.T) {

stack.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import "errors"
77
func (l *Lexer) pop() rune {
88
tail := l.parseStack[len(l.parseStack)-1]
99
l.parseStack = l.parseStack[:len(l.parseStack)-1]
10+
11+
l.printParseStack()
1012
return tail
1113
}
1214

@@ -21,6 +23,8 @@ func (l *Lexer) popFlush() (string, error) {
2123
c = l.pop()
2224
}
2325

26+
l.printParseStack()
27+
2428
return result, nil
2529
}
2630

@@ -30,11 +34,16 @@ func (l *Lexer) popCond(c rune) error {
3034
return errors.New("invalid stack pop")
3135
}
3236
l.parseStack = l.parseStack[:len(l.parseStack)-1]
37+
38+
l.printParseStack()
3339
return nil
3440
}
3541

3642
func (l *Lexer) push(c rune) {
3743
l.parseStack = append(l.parseStack, c)
44+
45+
l.printParseStack()
46+
3847
}
3948

4049
func (l *Lexer) pushString(s string) {
@@ -45,4 +54,5 @@ func (l *Lexer) pushString(s string) {
4554

4655
func (l *Lexer) pushFlush() {
4756
l.parseStack = append(l.parseStack, '#')
57+
4858
}

token/token.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type Selection struct {
2929
Name string
3030
// will be empty, if the selection have no sub field
3131
InnerSelection SelectionSet
32+
Arguments ArgumentSet
3233
// TODO: wont be implemented for now
3334
Alias string
3435
}

0 commit comments

Comments
 (0)