From 6f0e5fdf0dba155ad404d9a47c179de2c2699b1e Mon Sep 17 00:00:00 2001 From: Ben Kraft Date: Wed, 15 Jul 2020 12:32:21 -0700 Subject: [PATCH] unions are easy too, sorta --- README.md | 1 - generate/testdata/InterfaceNoFragments.graphql.go | 14 ++++++-------- generate/testdata/UnionNoFragments.graphql | 5 +++++ generate/testdata/UnionNoFragments.graphql.go | 5 +++++ generate/testdata/schema.graphql | 3 +++ generate/types.go | 7 +++---- 6 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 generate/testdata/UnionNoFragments.graphql create mode 100644 generate/testdata/UnionNoFragments.graphql.go diff --git a/README.md b/README.md index ea4bb94..a197aa2 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,6 @@ TODO(benkraft): Figure out how to get GitHub Actions to run the example -- it ne ## Major TODOs Query structures to support: -- unions - fragments Config options: diff --git a/generate/testdata/InterfaceNoFragments.graphql.go b/generate/testdata/InterfaceNoFragments.graphql.go index 8cc38b1..cf9dc73 100644 --- a/generate/testdata/InterfaceNoFragments.graphql.go +++ b/generate/testdata/InterfaceNoFragments.graphql.go @@ -1,12 +1,10 @@ type Response struct { Root struct { - Id string `json:"id"` - Name string `json:"name"` - Children []content `json:"children"` + Id string `json:"id"` + Name string `json:"name"` + Children []struct { + Id string `json:"id"` + Name string `json:"name"` + } `json:"children"` } `json:"root"` -} - -type content struct { - Id string `json:"id"` - Name string `json:"name"` } \ No newline at end of file diff --git a/generate/testdata/UnionNoFragments.graphql b/generate/testdata/UnionNoFragments.graphql new file mode 100644 index 0000000..0f4336b --- /dev/null +++ b/generate/testdata/UnionNoFragments.graphql @@ -0,0 +1,5 @@ +{ + randomLeaf { + __typename + } +} diff --git a/generate/testdata/UnionNoFragments.graphql.go b/generate/testdata/UnionNoFragments.graphql.go new file mode 100644 index 0000000..d737f74 --- /dev/null +++ b/generate/testdata/UnionNoFragments.graphql.go @@ -0,0 +1,5 @@ +type Response struct { + RandomLeaf struct { + Typename *string `json:"__typename"` + } `json:"randomLeaf"` +} \ No newline at end of file diff --git a/generate/testdata/schema.graphql b/generate/testdata/schema.graphql index 6f6a136..a3b1e9f 100644 --- a/generate/testdata/schema.graphql +++ b/generate/testdata/schema.graphql @@ -32,6 +32,8 @@ interface Content { parent: Topic } +union LeafContent = Article | Video + type Article implements Content { id: ID! name: String! @@ -56,4 +58,5 @@ type Topic implements Content { type Query { user(query: UserQueryInput): User root: Topic! + randomLeaf: LeafContent! } diff --git a/generate/types.go b/generate/types.go index d84d076..3923892 100644 --- a/generate/types.go +++ b/generate/types.go @@ -200,9 +200,8 @@ func (builder *typeBuilder) writeType(typ *ast.Type, selectionSet []selection, i } def := builder.schema.Types[typ.Name()] - // TODO: set inline = false for nested types switch def.Kind { - case ast.Scalar, ast.Enum, ast.Union, ast.Interface: + case ast.Scalar, ast.Enum: inline = false } @@ -222,7 +221,7 @@ func (builder *typeBuilder) writeType(typ *ast.Type, selectionSet []selection, i func (builder *typeBuilder) writeTypedef(typedef *ast.Definition, selectionSet []selection) error { switch typedef.Kind { - case ast.Object, ast.InputObject, ast.Interface: + case ast.Object, ast.InputObject, ast.Interface, ast.Union: builder.WriteString("struct {\n") for _, field := range selectionSet { err := builder.writeField(field) @@ -244,7 +243,7 @@ func (builder *typeBuilder) writeTypedef(typedef *ast.Definition, selectionSet [ } builder.WriteString(")\n") return nil - case ast.Scalar, ast.Union: + case ast.Scalar: // TODO(benkraft): Handle custom scalars, unions, and interfaces. return fmt.Errorf("not implemented: %v", typedef.Kind) default: