47 lines
1.4 KiB
Go
47 lines
1.4 KiB
Go
|
|
package sdlmerge
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
|
||
|
|
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
|
||
|
|
)
|
||
|
|
|
||
|
|
func newRemoveFieldDefinitions(directives ...string) *removeFieldDefinitionByDirective {
|
||
|
|
directivesSet := make(map[string]struct{}, len(directives))
|
||
|
|
for _, directive := range directives {
|
||
|
|
directivesSet[directive] = struct{}{}
|
||
|
|
}
|
||
|
|
|
||
|
|
return &removeFieldDefinitionByDirective{
|
||
|
|
directives: directivesSet,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
type removeFieldDefinitionByDirective struct {
|
||
|
|
operation *ast.Document
|
||
|
|
directives map[string]struct{}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *removeFieldDefinitionByDirective) Register(walker *astvisitor.Walker) {
|
||
|
|
walker.RegisterEnterDocumentVisitor(r)
|
||
|
|
walker.RegisterLeaveObjectTypeDefinitionVisitor(r)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *removeFieldDefinitionByDirective) EnterDocument(operation, _ *ast.Document) {
|
||
|
|
r.operation = operation
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *removeFieldDefinitionByDirective) LeaveObjectTypeDefinition(ref int) {
|
||
|
|
var refsForDeletion []int
|
||
|
|
// select fields for deletion
|
||
|
|
for _, fieldRef := range r.operation.ObjectTypeDefinitions[ref].FieldsDefinition.Refs {
|
||
|
|
for _, directiveRef := range r.operation.FieldDefinitions[fieldRef].Directives.Refs {
|
||
|
|
directiveName := r.operation.DirectiveNameString(directiveRef)
|
||
|
|
if _, ok := r.directives[directiveName]; ok {
|
||
|
|
refsForDeletion = append(refsForDeletion, fieldRef)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// delete fields
|
||
|
|
r.operation.RemoveFieldDefinitionsFromObjectTypeDefinition(refsForDeletion, ref)
|
||
|
|
}
|