Add support for specifying type-names, and conflict-detection (#94)
## Summary: In this commit I add two related features to genqlient: conflict-detection to avoid generating two distinct types with the same name, and an option to specify the type-name genqlient should use for some type. The conflict-detection was pretty simple once I realized I had already written all the code to do it in #70. There was a bunch of wiring, since we now need to keep track of the GraphQL type/selection-set that each type corresponds to, but it was pretty straightforward. This allows us to: - detect and reject if you have really sneaky type-names (there are some examples documented in `names.go`) - more clearly crash if genqlient accidentally generates two conflicting types, and - avoid stack-overflow when handing recursive (input) types (although sadly the poor support for options on input types (#14) makes them difficult to use in many cases; you really need to be able to set `pointer: true`) And with that all set up, the type-naming was also easy! (It doesn't have to get into the core of the type-generator, just plug in where we choose names. The desire for conflict detection was the main reason I hadn't set it up already.) Note that the existing limitation of #70 that the fields have to be in exactly the same order remains (and is now documented as #93); it's not deeply hard to fix but it's surprisingly much work. Issue: https://github.com/Khan/genqlient/issues/60 Issue: https://github.com/Khan/genqlient/issues/12 ## Test plan: make check Author: benjaminjkraft Reviewers: StevenACoffman, jvoll, benjaminjkraft, aberkan, csilvers, dnerdy, mahtabsabet, MiguelCastillo Required Reviewers: Approved By: StevenACoffman, jvoll Checks: ✅ Test (1.17), ✅ Test (1.16), ✅ Test (1.15), ✅ Test (1.14), ✅ Lint, ✅ Test (1.17), ✅ Test (1.16), ✅ Test (1.15), ✅ Test (1.14), ✅ Lint Pull Request URL: https://github.com/Khan/genqlient/pull/94
This commit is contained in:
+71
@@ -0,0 +1,71 @@
|
||||
package test
|
||||
|
||||
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
|
||||
|
||||
import (
|
||||
"github.com/Khan/genqlient/graphql"
|
||||
"github.com/Khan/genqlient/internal/testutil"
|
||||
)
|
||||
|
||||
// RecursionRecurRecursive includes the requested fields of the GraphQL type Recursive.
|
||||
type RecursionRecurRecursive struct {
|
||||
Rec RecursionRecurRecursiveRecRecursive `json:"rec"`
|
||||
}
|
||||
|
||||
// RecursionRecurRecursiveRecRecursive includes the requested fields of the GraphQL type Recursive.
|
||||
type RecursionRecurRecursiveRecRecursive struct {
|
||||
Rec RecursionRecurRecursiveRecRecursiveRecRecursive `json:"rec"`
|
||||
}
|
||||
|
||||
// RecursionRecurRecursiveRecRecursiveRecRecursive includes the requested fields of the GraphQL type Recursive.
|
||||
type RecursionRecurRecursiveRecRecursiveRecRecursive struct {
|
||||
Rec RecursionRecurRecursiveRecRecursiveRecRecursiveRecRecursive `json:"rec"`
|
||||
}
|
||||
|
||||
// RecursionRecurRecursiveRecRecursiveRecRecursiveRecRecursive includes the requested fields of the GraphQL type Recursive.
|
||||
type RecursionRecurRecursiveRecRecursiveRecRecursiveRecRecursive struct {
|
||||
Id testutil.ID `json:"id"`
|
||||
}
|
||||
|
||||
// RecursionResponse is returned by Recursion on success.
|
||||
type RecursionResponse struct {
|
||||
Recur RecursionRecurRecursive `json:"recur"`
|
||||
}
|
||||
|
||||
type RecursiveInput struct {
|
||||
Rec []RecursiveInput `json:"rec"`
|
||||
}
|
||||
|
||||
func Recursion(
|
||||
client graphql.Client,
|
||||
input RecursiveInput,
|
||||
) (*RecursionResponse, error) {
|
||||
variables := map[string]interface{}{
|
||||
"input": input,
|
||||
}
|
||||
|
||||
var err error
|
||||
|
||||
var retval RecursionResponse
|
||||
err = client.MakeRequest(
|
||||
nil,
|
||||
"Recursion",
|
||||
`
|
||||
query Recursion ($input: RecursiveInput!) {
|
||||
recur(input: $input) {
|
||||
rec {
|
||||
rec {
|
||||
rec {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
`,
|
||||
&retval,
|
||||
variables,
|
||||
)
|
||||
return &retval, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user