Reject the use of both typename and bind (#172)
In #133, Craig added support for a new use of typename, where it applies to a scalar and means that genqlient should generate a named type, e.g. `# @genqlient(typename: "MyString")` on a node of type string will generate and use `type MyString string`. But this gets a bit confusing if you mix it with `bind`; should `typename: "MyString", bind: "int32"` generate `type MyString int32`, or should one override the other, or what? Of course in practice you're not likely to write that all in one place, but you could via a global binding, or a `for` directive, and in that case probably it was a mistake. In #138, we looked at making them work together correctly, but it added complexity and got even more confusing. So instead, here, we just ban it; we can always add it back if it proves useful. (Or, you can make the `typename` win over a global binding by locally unbinding it via `bind: "-"`.) This required changes in surprisingly many places; I already knew the directive-validation code was due for a refactor but that will happen some other day. The tests show that it works, in any case. Interestingly, this problem actually could have arisen for a struct binding already, before #133. But all the same reasons it's confusing seem to apply, so I just banned it there too. This is technically a breaking change although I doubt anyone will hit it. Test plan: make check
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
# @genqlient(for: "User.name", bind: "[]byte")
|
||||
query ConflictingTypeNameAndGlobalBind {
|
||||
user {
|
||||
# @genqlient(typename: "MyID")
|
||||
name
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
type Query {
|
||||
user: User
|
||||
}
|
||||
|
||||
type User {
|
||||
id: ID!
|
||||
name: String!
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
query ConflictingTypeNameAndGlobalBind {
|
||||
user {
|
||||
# @genqlient(typename: "OtherScalar")
|
||||
name
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
type Query {
|
||||
user: User
|
||||
}
|
||||
|
||||
type User {
|
||||
id: ID!
|
||||
name: ValidScalar!
|
||||
}
|
||||
|
||||
scalar ValidScalar
|
||||
@@ -0,0 +1,6 @@
|
||||
query ConflictingTypeNameAndGlobalBind {
|
||||
user {
|
||||
# @genqlient(bind: "[]byte", typename: "MyID")
|
||||
name
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
type Query {
|
||||
user: User
|
||||
}
|
||||
|
||||
type User {
|
||||
id: ID!
|
||||
name: String!
|
||||
}
|
||||
+1
@@ -0,0 +1 @@
|
||||
testdata/errors/ConflictingTypeNameAndForFieldBind.graphql:5: typename and bind may not be used together
|
||||
+1
@@ -0,0 +1 @@
|
||||
testdata/errors/ConflictingTypeNameAndGlobalBind.schema.graphql:8: typename option conflicts with global binding for ValidScalar; use `bind: "-"` to override it
|
||||
+1
@@ -0,0 +1 @@
|
||||
testdata/errors/ConflictingTypeNameAndLocalBind.graphql:4: typename and bind may not be used together
|
||||
Reference in New Issue
Block a user