Skip to content

Conversation

tomoikey
Copy link
Contributor

@tomoikey tomoikey commented Jun 27, 2025

Change Summary

  • Eliminated the global variable specifiedRules; instead a dedicated rules.Rules structure now holds the rule set.
  • Added LoadQueryWithRules, MustLoadQueryWithRules, and ValidateWithRules, each of which requires an explicit *rules.Rules.
  • The former functions LoadQuery, MustLoadQuery, and Validate are deprecated and scheduled for removal in a future major release.
  • Because every goroutine can maintain its own rule set, data-race risks under concurrent execution are removed.

Old vs. New API

Old API (deprecated) New API
LoadQuery LoadQueryWithRules
MustLoadQuery MustLoadQueryWithRules
Validate ValidateWithRules

How to migrate

Create a default rule set

rules.NewDefaultRules()

Specify some rules

someRule := validator.Rule{
	Name: "SomeRule",
	RuleFunc: func(observers *validator.Events, addError validator.AddErrFunc) {
		addError(validator.Message("%s", "some error message"))
	},
}

someOtherRule := validator.Rule{
	Name: "SomeOtherRule",
	RuleFunc: func(observers *validator.Events, addError validator.AddErrFunc) {
		addError(validator.Message("%s", "some other error message"))
	},
}

validator.ValidateWithRules(s, q, rules.NewRules(someRule, someOtherRule))

Customise rules

someRules := rules.NewDefaultRules()
someRules.AddRule("SomeRule", someRule.RuleFunc)
someRules.RemoveRule("SomeRule")

Minimal Example

package main

import (
	"github.com/vektah/gqlparser/v2/ast"
	"github.com/vektah/gqlparser/v2/gqlparser"
	"github.com/vektah/gqlparser/v2/validator/rules"
)

func main() {
	schema, _ := gqlparser.LoadSchema(&ast.Source{Name: "graph/schema.graphqls", Input: `
	type Query {
		bar: String!
	}
	`, BuiltIn: false})
	queryStr := `
		query Foo {
			bar
		}
	`

	// 1. Create the default rule set
	defaultRules := rules.NewDefaultRules()

	// 2. Customise rules if required
	// defaultRules.RemoveRule(rules.MaxIntrospectionDepth.Name)

	// 3. Parse and validate a query using the rule set
	queryDoc, errs := gqlparser.LoadQueryWithRules(schema, queryStr, defaultRules)
	if len(errs) != 0 {
		// Handle validation errors
	}
	_ = queryDoc
}

Based on

This branch is based on refactor/rules2

relates to

#379


I have:

  • Added tests covering the bug / feature
  • Updated any relevant documentation

@coveralls
Copy link

coveralls commented Jun 27, 2025

Coverage Status

coverage: 87.364% (-0.3%) from 87.677%
when pulling 6a9e550 on tomoikey:refactor/rules3
into 9e14766 on vektah:master.

@StevenACoffman StevenACoffman merged commit 22fa045 into vektah:master Jun 27, 2025
7 checks passed
@StevenACoffman
Copy link
Collaborator

See 99designs/gqlgen#3751

@StevenACoffman
Copy link
Collaborator

@tomoikey It would be good for folks who wind up here to put an example here how to adjust their code to the new way.

@tomoikey
Copy link
Contributor Author

@StevenACoffman
Thanks! I updated this PR descriptions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants