mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 05:47:37 +01:00
* Bump golang.org/x/text from 0.3.7 to 0.3.8 Bumps [golang.org/x/text](https://github.com/golang/text) from 0.3.7 to 0.3.8. - [Release notes](https://github.com/golang/text/releases) - [Commits](https://github.com/golang/text/compare/v0.3.7...v0.3.8) --- updated-dependencies: - dependency-name: golang.org/x/text dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> * Update go dependencies * Update x/net --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
136 lines
2.3 KiB
Go
136 lines
2.3 KiB
Go
package parser
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/vektah/gqlparser/v2/ast"
|
|
"github.com/vektah/gqlparser/v2/gqlerror"
|
|
"github.com/vektah/gqlparser/v2/lexer"
|
|
)
|
|
|
|
type parser struct {
|
|
lexer lexer.Lexer
|
|
err error
|
|
|
|
peeked bool
|
|
peekToken lexer.Token
|
|
peekError error
|
|
|
|
prev lexer.Token
|
|
}
|
|
|
|
func (p *parser) peekPos() *ast.Position {
|
|
if p.err != nil {
|
|
return nil
|
|
}
|
|
|
|
peek := p.peek()
|
|
return &peek.Pos
|
|
}
|
|
|
|
func (p *parser) peek() lexer.Token {
|
|
if p.err != nil {
|
|
return p.prev
|
|
}
|
|
|
|
if !p.peeked {
|
|
p.peekToken, p.peekError = p.lexer.ReadToken()
|
|
p.peeked = true
|
|
}
|
|
|
|
return p.peekToken
|
|
}
|
|
|
|
func (p *parser) error(tok lexer.Token, format string, args ...interface{}) {
|
|
if p.err != nil {
|
|
return
|
|
}
|
|
p.err = gqlerror.ErrorLocf(tok.Pos.Src.Name, tok.Pos.Line, tok.Pos.Column, format, args...)
|
|
}
|
|
|
|
func (p *parser) next() lexer.Token {
|
|
if p.err != nil {
|
|
return p.prev
|
|
}
|
|
if p.peeked {
|
|
p.peeked = false
|
|
p.prev, p.err = p.peekToken, p.peekError
|
|
} else {
|
|
p.prev, p.err = p.lexer.ReadToken()
|
|
}
|
|
return p.prev
|
|
}
|
|
|
|
func (p *parser) expectKeyword(value string) lexer.Token {
|
|
tok := p.peek()
|
|
if tok.Kind == lexer.Name && tok.Value == value {
|
|
return p.next()
|
|
}
|
|
|
|
p.error(tok, "Expected %s, found %s", strconv.Quote(value), tok.String())
|
|
return tok
|
|
}
|
|
|
|
func (p *parser) expect(kind lexer.Type) lexer.Token {
|
|
tok := p.peek()
|
|
if tok.Kind == kind {
|
|
return p.next()
|
|
}
|
|
|
|
p.error(tok, "Expected %s, found %s", kind, tok.Kind.String())
|
|
return tok
|
|
}
|
|
|
|
func (p *parser) skip(kind lexer.Type) bool {
|
|
if p.err != nil {
|
|
return false
|
|
}
|
|
|
|
tok := p.peek()
|
|
|
|
if tok.Kind != kind {
|
|
return false
|
|
}
|
|
p.next()
|
|
return true
|
|
}
|
|
|
|
func (p *parser) unexpectedError() {
|
|
p.unexpectedToken(p.peek())
|
|
}
|
|
|
|
func (p *parser) unexpectedToken(tok lexer.Token) {
|
|
p.error(tok, "Unexpected %s", tok.String())
|
|
}
|
|
|
|
func (p *parser) many(start lexer.Type, end lexer.Type, cb func()) {
|
|
hasDef := p.skip(start)
|
|
if !hasDef {
|
|
return
|
|
}
|
|
|
|
for p.peek().Kind != end && p.err == nil {
|
|
cb()
|
|
}
|
|
p.next()
|
|
}
|
|
|
|
func (p *parser) some(start lexer.Type, end lexer.Type, cb func()) {
|
|
hasDef := p.skip(start)
|
|
if !hasDef {
|
|
return
|
|
}
|
|
|
|
called := false
|
|
for p.peek().Kind != end && p.err == nil {
|
|
called = true
|
|
cb()
|
|
}
|
|
|
|
if !called {
|
|
p.error(p.peek(), "expected at least one definition, found %s", p.peek().Kind.String())
|
|
return
|
|
}
|
|
|
|
p.next()
|
|
}
|