Skip to content

Commit

Permalink
consolidate model.NameReference and graph.typeOrField types
Browse files Browse the repository at this point in the history
  • Loading branch information
benweint committed Jun 4, 2024
1 parent 563fb04 commit b4dff4e
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 48 deletions.
10 changes: 5 additions & 5 deletions pkg/graph/graph.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ func (g *Graph) ReachableFrom(roots []*model.NameReference, maxDepth int) *Graph
var traverse func(n *model.Definition, depth int)

traverseField := func(typeName string, f *model.FieldDefinition, depth int) {
key := fieldRef(typeName, f.Name)
key := model.FieldNameReference(typeName, f.Name)
if seen[key] {
return
}
Expand All @@ -161,7 +161,7 @@ func (g *Graph) ReachableFrom(roots []*model.NameReference, maxDepth int) *Graph
if maxDepth > 0 && depth > maxDepth {
return
}
key := typeRef(n.Name)
key := model.TypeNameReference(n.Name)
if _, ok := seen[key]; ok {
return
}
Expand All @@ -185,9 +185,9 @@ func (g *Graph) ReachableFrom(roots []*model.NameReference, maxDepth int) *Graph
}

for _, root := range roots {
targetType := root.GetTargetType()
if fieldName := root.GetFieldName(); fieldName != "" {
traverseField(targetType.Name, targetType.Fields.Named(fieldName), 1)
targetType := g.nodes[root.TypeName]
if root.FieldName != "" {
traverseField(targetType.Name, targetType.Fields.Named(root.FieldName), 1)
} else {
traverse(targetType, 1)
}
Expand Down
24 changes: 3 additions & 21 deletions pkg/graph/reference_set.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,14 @@ package graph

import "github.com/benweint/gquil/pkg/model"

// typeOrField refers to either an entire GraphQL type (e.g. a union type), or to a specific field
// on a type. When refering to an entire type, the fieldName field is set to its zero value (empty string).
type typeOrField struct {
typeName string
fieldName string
}

func typeRef(name string) typeOrField {
return typeOrField{typeName: name}
}

func fieldRef(typeName, fieldName string) typeOrField {
return typeOrField{
typeName: typeName,
fieldName: fieldName,
}
}

// referenceSet captures the set of types & fields which have been encountered when traversing a GraphQL schema.
type referenceSet map[typeOrField]bool
type referenceSet map[model.NameReference]bool

// includesType returns true if the target referenceSet includes at least one field on the given type name,
// or a key representing the entire type.
func (s referenceSet) includesType(name string) bool {
for key := range s {
if key.typeName == name {
if key.TypeName == name {
return true
}
}
Expand All @@ -36,7 +18,7 @@ func (s referenceSet) includesType(name string) bool {

// includesField returns true if the given referenceSet includes a key representing the given field on the given type.
func (s referenceSet) includesField(typeName, fieldName string) bool {
return s[typeOrField{typeName: typeName, fieldName: fieldName}]
return s[model.FieldNameReference(typeName, fieldName)]
}

// filterFields returns a copy of the given definition, where the field list has been filtered to only include
Expand Down
8 changes: 3 additions & 5 deletions pkg/model/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,18 +80,16 @@ func (s *Schema) resolveName(name string) *NameReference {
if def.Name == typePart {
if len(parts) == 1 {
return &NameReference{
Kind: TypeNameReference,
typeRef: def,
TypeName: def.Name,
}
}

fieldPart := parts[1]
for _, field := range def.Fields {
if field.Name == fieldPart {
return &NameReference{
Kind: FieldNameReference,
typeRef: def,
field: field,
TypeName: def.Name,
FieldName: field.Name,
}
}
}
Expand Down
27 changes: 10 additions & 17 deletions pkg/model/name_reference.go
Original file line number Diff line number Diff line change
@@ -1,26 +1,19 @@
package model

type NameReferenceKind int

const (
TypeNameReference = iota
FieldNameReference
InputFieldNameReference
)

type NameReference struct {
Kind NameReferenceKind
typeRef *Definition
field *FieldDefinition
TypeName string
FieldName string
}

func (n *NameReference) GetTargetType() *Definition {
return n.typeRef
func TypeNameReference(name string) NameReference {
return NameReference{
TypeName: name,
}
}

func (n *NameReference) GetFieldName() string {
if n.field != nil {
return n.field.Name
func FieldNameReference(typeName, fieldName string) NameReference {
return NameReference{
TypeName: typeName,
FieldName: fieldName,
}
return ""
}

0 comments on commit b4dff4e

Please sign in to comment.