-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathparse.go
48 lines (43 loc) · 1.02 KB
/
parse.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package query
import (
"io"
"strings"
"github.com/pkg/errors"
"github.com/zoncoen/query-go/ast"
"github.com/zoncoen/query-go/parser"
)
// Parse parses a query string via r and returns the corresponding Query.
func Parse(r io.Reader, opts ...Option) (*Query, error) {
node, err := parser.NewParser(r).Parse()
if err != nil {
return nil, err
}
return buildQuery(New(opts...), node)
}
// ParseString parses a query string s and returns the corresponding Query.
func ParseString(s string, opts ...Option) (*Query, error) {
return Parse(strings.NewReader(s), opts...)
}
func buildQuery(q *Query, node ast.Node) (*Query, error) {
if q == nil || node == nil {
return q, nil
}
var err error
switch n := node.(type) {
case *ast.Root:
q = q.Root()
case *ast.Selector:
q, err = buildQuery(q, n.X)
if err == nil {
q = q.Key(n.Sel)
}
case *ast.Index:
q, err = buildQuery(q, n.X)
if err == nil {
q = q.Index(n.Index)
}
default:
return nil, errors.Errorf("unknown node type: %T", node)
}
return q, err
}