CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/golang-github-com--graphql-go--graphql

Complete GraphQL implementation in Go with schema definition, query execution, and validation.

Overview
Eval results
Files

validation.mddocs/reference/

Validation

Validate parsed GraphQL documents against a schema to ensure they are semantically correct.

ValidateDocument

func ValidateDocument(schema *Schema, astDoc *ast.Document, rules []ValidationRuleFn) (vr ValidationResult)

type ValidationResult struct {
    IsValid bool
    Errors  []gqlerrors.FormattedError
}

Pass nil for rules to use the full set of specified rules (SpecifiedRules).

Example:

doc, _ := parser.Parse(parser.ParseParams{Source: src})
result := graphql.ValidateDocument(&schema, doc, nil)
if !result.IsValid {
    for _, err := range result.Errors {
        fmt.Println(err.Message)
    }
}

VisitUsingRules

func VisitUsingRules(schema *Schema, typeInfo *TypeInfo, astDoc *ast.Document, rules []ValidationRuleFn) []gqlerrors.FormattedError

Runs multiple visitors in parallel while maintaining the visitor skip/break API. Primarily used internally.

Built-in Validation Rules

var SpecifiedRules = []ValidationRuleFn{
    ArgumentsOfCorrectTypeRule,
    DefaultValuesOfCorrectTypeRule,
    FieldsOnCorrectTypeRule,
    FragmentsOnCompositeTypesRule,
    KnownArgumentNamesRule,
    KnownDirectivesRule,
    KnownFragmentNamesRule,
    KnownTypeNamesRule,
    LoneAnonymousOperationRule,
    NoFragmentCyclesRule,
    NoUndefinedVariablesRule,
    NoUnusedFragmentsRule,
    NoUnusedVariablesRule,
    OverlappingFieldsCanBeMergedRule,
    PossibleFragmentSpreadsRule,
    ProvidedNonNullArgumentsRule,
    ScalarLeafsRule,
    UniqueArgumentNamesRule,
    UniqueFragmentNamesRule,
    UniqueInputFieldNamesRule,
    UniqueOperationNamesRule,
    UniqueVariableNamesRule,
    VariablesAreInputTypesRule,
    VariablesInAllowedPositionRule,
}

Each rule is a function of type:

type ValidationRuleFn func(context *ValidationContext) *ValidationRuleInstance

type ValidationRuleInstance struct {
    VisitorOpts *visitor.VisitorOptions
}

Individual Rule Functions

func ArgumentsOfCorrectTypeRule(context *ValidationContext) *ValidationRuleInstance
// Validates argument literal values are the correct type.

func DefaultValuesOfCorrectTypeRule(context *ValidationContext) *ValidationRuleInstance
// Validates variable default values are of the correct type.

func FieldsOnCorrectTypeRule(context *ValidationContext) *ValidationRuleInstance
// Validates all selected fields are defined on their parent type.

func FragmentsOnCompositeTypesRule(context *ValidationContext) *ValidationRuleInstance
// Validates fragments are spread on composite types (object, interface, union).

func KnownArgumentNamesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all supplied argument names are defined on the field or directive.

func KnownDirectivesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all @directives are known and legally positioned.

func KnownFragmentNamesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all fragment spreads reference defined fragments.

func KnownTypeNamesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all referenced type names are defined in the schema.

func LoneAnonymousOperationRule(context *ValidationContext) *ValidationRuleInstance
// Validates that anonymous operations appear alone in a document.

func NoFragmentCyclesRule(context *ValidationContext) *ValidationRuleInstance
// Validates that no fragments form cycles via fragment spreads.

func NoUndefinedVariablesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all variables referenced are defined in the operation.

func NoUnusedFragmentsRule(context *ValidationContext) *ValidationRuleInstance
// Validates all defined fragments are spread within operations.

func NoUnusedVariablesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all defined variables are used.

func OverlappingFieldsCanBeMergedRule(context *ValidationContext) *ValidationRuleInstance
// Validates that all field selections in a set can be merged without ambiguity.

func PossibleFragmentSpreadsRule(context *ValidationContext) *ValidationRuleInstance
// Validates fragment spreads are on possible types.

func ProvidedNonNullArgumentsRule(context *ValidationContext) *ValidationRuleInstance
// Validates all required (non-null) arguments are provided.

func ScalarLeafsRule(context *ValidationContext) *ValidationRuleInstance
// Validates leaf fields are scalar or enum types.

func UniqueArgumentNamesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all supplied argument names are unique.

func UniqueFragmentNamesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all fragment definitions have unique names.

func UniqueInputFieldNamesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all input object fields are uniquely named.

func UniqueOperationNamesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all operations have unique names.

func UniqueVariableNamesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all variables in an operation are uniquely named.

func VariablesAreInputTypesRule(context *ValidationContext) *ValidationRuleInstance
// Validates all variable types are input types.

func VariablesInAllowedPositionRule(context *ValidationContext) *ValidationRuleInstance
// Validates variables are used in positions where their type is compatible.

Custom Validation Rules

Implement a custom rule by providing a ValidationRuleFn:

myRule := func(ctx *graphql.ValidationContext) *graphql.ValidationRuleInstance {
    return &graphql.ValidationRuleInstance{
        VisitorOpts: &visitor.VisitorOptions{
            EnterKindMap: map[string]visitor.VisitFunc{
                "Field": func(p visitor.VisitFuncParams) (string, interface{}) {
                    // inspect the field node
                    if field, ok := p.Node.(*ast.Field); ok {
                        if field.Name.Value == "forbidden" {
                            ctx.ReportError(fmt.Errorf("field 'forbidden' is not allowed"))
                        }
                    }
                    return visitor.ActionNoChange, nil
                },
            },
        },
    }
}

result := graphql.ValidateDocument(&schema, doc, []graphql.ValidationRuleFn{myRule})

ValidationContext

Provides information about the current traversal state during validation.

func NewValidationContext(schema *Schema, astDoc *ast.Document, typeInfo *TypeInfo) *ValidationContext

func (ctx *ValidationContext) Schema() *Schema
func (ctx *ValidationContext) Document() *ast.Document
func (ctx *ValidationContext) Type() Output
func (ctx *ValidationContext) ParentType() Composite
func (ctx *ValidationContext) InputType() Input
func (ctx *ValidationContext) FieldDef() *FieldDefinition
func (ctx *ValidationContext) Directive() *Directive
func (ctx *ValidationContext) Argument() *Argument
func (ctx *ValidationContext) Fragment(name string) *ast.FragmentDefinition
func (ctx *ValidationContext) FragmentSpreads(node *ast.SelectionSet) []*ast.FragmentSpread
func (ctx *ValidationContext) RecursivelyReferencedFragments(operation *ast.OperationDefinition) []*ast.FragmentDefinition
func (ctx *ValidationContext) VariableUsages(node HasSelectionSet) []*VariableUsage
func (ctx *ValidationContext) RecursiveVariableUsages(operation *ast.OperationDefinition) []*VariableUsage
func (ctx *ValidationContext) Errors() []gqlerrors.FormattedError
func (ctx *ValidationContext) ReportError(err error)
type VariableUsage struct {
    Node *ast.Variable
    Type Input
}

type HasSelectionSet interface {
    GetKind() string
    GetLoc() *ast.Location
    GetSelectionSet() *ast.SelectionSet
}

TypeInfo

TypeInfo tracks type information as the AST is traversed and is used by the validator.

type TypeInfoConfig struct {
    Schema *Schema
    // FieldDefFn is an experimental optional parameter; not for general use.
}

func NewTypeInfo(opts *TypeInfoConfig) *TypeInfo

func (ti *TypeInfo) Type() Output
func (ti *TypeInfo) ParentType() Composite
func (ti *TypeInfo) InputType() Input
func (ti *TypeInfo) FieldDef() *FieldDefinition
func (ti *TypeInfo) Directive() *Directive
func (ti *TypeInfo) Argument() *Argument
func (ti *TypeInfo) Enter(node ast.Node)
func (ti *TypeInfo) Leave(node ast.Node)

Validation Error Messages

Helper functions that generate standard validation error message strings:

func CycleErrorMessage(fragName string, spreadNames []string) string
func MisplaceDirectiveMessage(directiveName string, location string) string
func UndefinedFieldMessage(fieldName string, ttypeName string, suggestedTypeNames []string, suggestedFieldNames []string) string
func UndefinedVarMessage(varName string, opName string) string
func UnusedVariableMessage(varName string, opName string) string
func FieldASTsToNodeASTs(fieldASTs []*ast.Field) []ast.Node
func DefaultTypeInfoFieldDef(schema *Schema, parentType Type, fieldAST *ast.Field) *FieldDefinition

Install with Tessl CLI

npx tessl i tessl/golang-github-com--graphql-go--graphql@0.8.0

docs

index.md

tile.json