Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 35 additions & 21 deletions validator/rules/scalar_leafs.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.`,
Expand All @@ -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)
},
}