Skip to content

Commit

Permalink
Merge pull request #27 from rigglo/full-language-support
Browse files Browse the repository at this point in the history
Full language support
  • Loading branch information
Fontinalis authored May 11, 2020
2 parents cd30ccc + af37fd7 commit 6488c23
Show file tree
Hide file tree
Showing 7 changed files with 1,119 additions and 37 deletions.
6 changes: 3 additions & 3 deletions execution.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func (e *Executor) Execute(ctx context.Context, p Params) *Result {
}

callExtensions(ctx, e.config.Extensions, EventParseStart, nil)
t, doc, err := parser.Parse([]byte(p.Query))
doc, err := parser.Parse([]byte(p.Query))
callExtensions(ctx, e.config.Extensions, EventParseFinish, err)
if err != nil {
return &Result{
Expand All @@ -60,8 +60,8 @@ func (e *Executor) Execute(ctx context.Context, p Params) *Result {
err.Error(),
[]*ErrorLocation{
{
Column: t.Col,
Line: t.Line,
Column: err.(*parser.ParserError).Column,
Line: err.(*parser.ParserError).Line,
},
},
nil,
Expand Down
48 changes: 48 additions & 0 deletions pkg/language/ast/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package ast

import (
"fmt"
"strings"
)

type Document struct {
Operations []*Operation
Fragments []*Fragment
Definitions []Definition
}

func NewDocument() *Document {
return &Document{
Operations: []*Operation{},
Fragments: []*Fragment{},
Definitions: []Definition{},
}
}

const (
// Executable directive locations
QueryDirectiveLocation string = "QUERY"
MutationDirectiveLocation string = "MUTATION"
SubscriptionDirectiveLocation string = "SUBSCRIPTION"
FieldDirectiveLocation string = "FIELD"
FragmentDefinitionDirectiveLocation string = "FRAGMENT_DEFINITION"
FragmentSpreadDirectiveLocation string = "FRAGMENT_SPREAD"
InlineFragmentDirectiveLocation string = "INLINE_FRAGMENT"

// TypeSystem directive locations
SchemaDirectiveLocation string = "SCHEMA"
ScalarDirectiveLocation string = "SCALAR"
ObjectDirectiveLocation string = "OBJECT"
FieldDefinitionDirectiveLocation string = "FIELD_DEFINITION"
ArguentDefinitionDirectiveLocation string = "ARGUMENT_DEFINITION"
InterfaceDirectiveLocation string = "INTERFACE"
UnionDirectiveLocation string = "UNION"
EnumDirectiveLocation string = "ENUM"
EnumValueDirectiveLocation string = "ENUM_VALUE"
InputObjectDirectiveLocation string = "INPUT_OBJECT"
InputFieldDefinitionDirectiveLocation string = "INPUT_FIELD_DEFINITION"
)

func IsValidDirective(d string) bool {
return strings.Contains("QUERY MUTATION SUBSCRIPTION FIELD FRAGMENT_DEFINITION FRAGMENT_SPREAD INLINE_FRAGMENT SCHEMA SCALAR OBJECT FIELD_DEFINITION ARGUMENT_DEFINITION INTERFACE UNION ENUM ENUM_VALUE INPUT_OBJECT INPUT_FIELD_DEFINITION", fmt.Sprintf(" %s ", d))
}
12 changes: 0 additions & 12 deletions pkg/language/ast/ast.go → pkg/language/ast/executable.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,6 @@ type Location struct {
Line int
}

type Document struct {
Operations []*Operation
Fragments []*Fragment
}

func NewDocument() *Document {
return &Document{
Operations: []*Operation{},
Fragments: []*Fragment{},
}
}

type Fragment struct {
Name string
TypeCondition string
Expand Down
127 changes: 127 additions & 0 deletions pkg/language/ast/typesystem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package ast

type DefinitionKind uint

const (
SchemaKind DefinitionKind = iota
ScalarKind
ObjectKind
InterfaceKind
UnionKind
EnumKind
InputObjectKind
DirectiveKind
)

type Definition interface {
Kind() DefinitionKind
}

type SchemaDefinition struct {
Name string
Directives []*Directive
RootOperations map[OperationType]*NamedType
}

func (d *SchemaDefinition) Kind() DefinitionKind {
return SchemaKind
}

type ScalarDefinition struct {
Description string
Name string
Directives []*Directive
}

func (d *ScalarDefinition) Kind() DefinitionKind {
return ScalarKind
}

type ObjectDefinition struct {
Description string
Name string
Implements []*NamedType
Directives []*Directive
Fields []*FieldDefinition
}

func (d *ObjectDefinition) Kind() DefinitionKind {
return ObjectKind
}

type FieldDefinition struct {
Description string
Name string
Arguments []*InputValueDefinition
Type Type
Directives []*Directive
}

type InputValueDefinition struct {
Description string
Name string
Type Type
DefaultValue Value
Directives []*Directive
}

type InterfaceDefinition struct {
Description string
Name string
Directives []*Directive
Fields []*FieldDefinition
}

func (d *InterfaceDefinition) Kind() DefinitionKind {
return InterfaceKind
}

type UnionDefinition struct {
Description string
Name string
Directives []*Directive
Members []*NamedType
}

func (d *UnionDefinition) Kind() DefinitionKind {
return UnionKind
}

type EnumDefinition struct {
Description string
Name string
Directives []*Directive
Values []*EnumValueDefinition
}

func (d *EnumDefinition) Kind() DefinitionKind {
return EnumKind
}

type EnumValueDefinition struct {
Description string
Value *EnumValue
Directives []*Directive
}

type InputObjectDefinition struct {
Description string
Name string
Directives []*Directive
Fields []*InputValueDefinition
}

func (d *InputObjectDefinition) Kind() DefinitionKind {
return InputObjectKind
}

type DirectiveDefinition struct {
Description string
Name string
Locations []string
Arguments []*InputValueDefinition
}

func (d *DirectiveDefinition) Kind() DefinitionKind {
return DirectiveKind
}
4 changes: 2 additions & 2 deletions pkg/language/lexer/lexer.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const (
// BadToken is bad.. too bad..
BadToken TokenKind = iota
// PunctuatorToken has special characters
PunctuatorToken // ! $ ( ) ... : = @ [ ] { | }
PunctuatorToken // ! $ ( ) ... : = @ [ ] { | } &
// NameToken has names
NameToken // /[_A-Za-z][_0-9A-Za-z]*/
// IntValueToken has iteger numbers
Expand Down Expand Up @@ -149,7 +149,7 @@ func eatSpace(src *bufio.Reader, tokens chan<- Token, line, col int) (lexFn, int
case 'a' <= r && r <= 'z', 'A' <= r && r <= 'Z', r == '_':
return lexName, line, col
// Checking for Punctation
case strings.ContainsRune("!$().:=@[]{|}", r):
case strings.ContainsRune("!$().:=@[]{|}&", r):
if r == '.' {
return lexThreeDot(src, tokens, line, col)
}
Expand Down
Loading

0 comments on commit 6488c23

Please sign in to comment.