interfaces themselves are actually trivial!

This commit is contained in:
Ben Kraft
2020-07-15 12:20:19 -07:00
parent 279228f9a4
commit cf6f57f5f1
5 changed files with 54 additions and 3 deletions
+2 -1
View File
@@ -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)
+10
View File
@@ -0,0 +1,10 @@
{
root {
id
name
children {
id
name
}
}
}
+12
View File
@@ -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"`
}
+28
View File
@@ -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!
}
+2 -2
View File
@@ -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: