From 21fd3b8a0d41b63c40f012391033dca4ecfa80a5 Mon Sep 17 00:00:00 2001 From: Connor Lin Date: Sun, 8 Feb 2026 11:41:33 +0000 Subject: [PATCH] feat: create a new ScalarLeafsRuleWithoutSuggestions validator rule ScalarLeafsRule also appends "Did you mean" schema suggestions like e.g., KnownTypeNamesRule, but wasn't treated previously like other validator rules, possibly because it was calling `Suggestf()` which adds the "Did you mean" string. --- validator/rules/scalar_leafs.go | 56 ++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/validator/rules/scalar_leafs.go b/validator/rules/scalar_leafs.go index 95fd229..f4cb08d 100644 --- a/validator/rules/scalar_leafs.go +++ b/validator/rules/scalar_leafs.go @@ -6,31 +6,31 @@ import ( . "github.com/vektah/gqlparser/v2/validator/core" ) -var ScalarLeafsRule = Rule{ - Name: "ScalarLeafs", - RuleFunc: func(observers *Events, addError AddErrFunc) { - observers.OnField(func(walker *Walker, field *ast.Field) { - if field.Definition == nil { - return - } +func ruleFuncScalarLeafs(observers *Events, addError AddErrFunc, disableSuggestion bool) { + observers.OnField(func(walker *Walker, field *ast.Field) { + if field.Definition == nil { + return + } - fieldType := walker.Schema.Types[field.Definition.Type.Name()] - if fieldType == nil { - return - } + fieldType := walker.Schema.Types[field.Definition.Type.Name()] + if fieldType == nil { + return + } - if fieldType.IsLeafType() && len(field.SelectionSet) > 0 { + if fieldType.IsLeafType() && len(field.SelectionSet) > 0 { + addError( + Message(`Field "%s" must not have a selection since type "%s" has no subfields.`, field.Name, fieldType.Name), + At(field.Position), + ) + } + + if !fieldType.IsLeafType() && len(field.SelectionSet) == 0 { + if disableSuggestion { addError( - Message( - `Field "%s" must not have a selection since type "%s" has no subfields.`, - field.Name, - fieldType.Name, - ), + Message(`Field "%s" of type "%s" must have a selection of subfields.`, field.Name, field.Definition.Type.String()), At(field.Position), ) - } - - if !fieldType.IsLeafType() && len(field.SelectionSet) == 0 { + } else { addError( Message( `Field "%s" of type "%s" must have a selection of subfields.`, @@ -41,6 +41,20 @@ var ScalarLeafsRule = Rule{ At(field.Position), ) } - }) + } + }) +} + +var ScalarLeafsRule = Rule{ + Name: "ScalarLeafs", + RuleFunc: func(observers *Events, addError AddErrFunc) { + ruleFuncScalarLeafs(observers, addError, false) + }, +} + +var ScalarLeafsRuleWithoutSuggestions = Rule{ + Name: "ScalarLeafsWithoutSuggestions", + RuleFunc: func(observers *Events, addError AddErrFunc) { + ruleFuncScalarLeafs(observers, addError, true) }, }