diff --git a/README.md b/README.md index 790526d..643a136 100644 --- a/README.md +++ b/README.md @@ -60,8 +60,9 @@ TODO(benkraft): Figure out how to get GitHub Actions to run the example -- it ne ## Major TODOs Query structures to support: -- interfaces +- unions - fragments +- `__typename` Config options: - get schema via HTTP (perhaps even via GraphQL introspection) diff --git a/generate/testdata/InterfaceNoFragments.graphql b/generate/testdata/InterfaceNoFragments.graphql new file mode 100644 index 0000000..b46a8d8 --- /dev/null +++ b/generate/testdata/InterfaceNoFragments.graphql @@ -0,0 +1,10 @@ +{ + root { + id + name + children { + id + name + } + } +} diff --git a/generate/testdata/InterfaceNoFragments.graphql.go b/generate/testdata/InterfaceNoFragments.graphql.go new file mode 100644 index 0000000..8cc38b1 --- /dev/null +++ b/generate/testdata/InterfaceNoFragments.graphql.go @@ -0,0 +1,12 @@ +type Response struct { + Root struct { + Id string `json:"id"` + Name string `json:"name"` + Children []content `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/schema.graphql b/generate/testdata/schema.graphql index 08846b3..6f6a136 100644 --- a/generate/testdata/schema.graphql +++ b/generate/testdata/schema.graphql @@ -26,6 +26,34 @@ type User { authMethods: [AuthMethod!]! } +interface Content { + id: ID! + name: String! + parent: Topic +} + +type Article implements Content { + id: ID! + name: String! + parent: Topic! + text: String! +} + +type Video implements Content { + id: ID! + name: String! + parent: Topic! + duration: Int! +} + +type Topic implements Content { + id: ID! + name: String! + parent: Topic + children: [Content!]! +} + type Query { user(query: UserQueryInput): User + root: Topic! } diff --git a/generate/types.go b/generate/types.go index 486f95c..d84d076 100644 --- a/generate/types.go +++ b/generate/types.go @@ -222,7 +222,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: + case ast.Object, ast.InputObject, ast.Interface: builder.WriteString("struct {\n") for _, field := range selectionSet { err := builder.writeField(field) @@ -244,7 +244,7 @@ func (builder *typeBuilder) writeTypedef(typedef *ast.Definition, selectionSet [ } builder.WriteString(")\n") return nil - case ast.Scalar, ast.Union, ast.Interface: + case ast.Scalar, ast.Union: // TODO(benkraft): Handle custom scalars, unions, and interfaces. return fmt.Errorf("not implemented: %v", typedef.Kind) default: