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:
Ben Kraft
2022-02-09 16:54:31 -08:00
committed by GitHub
parent 8aa56aacf1
commit 67f2575cae
13 changed files with 81 additions and 0 deletions
@@ -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!
}
@@ -0,0 +1 @@
testdata/errors/ConflictingTypeNameAndForFieldBind.graphql:5: typename and bind may not be used together
@@ -0,0 +1 @@
testdata/errors/ConflictingTypeNameAndGlobalBind.schema.graphql:8: typename option conflicts with global binding for ValidScalar; use `bind: "-"` to override it
@@ -0,0 +1 @@
testdata/errors/ConflictingTypeNameAndLocalBind.graphql:4: typename and bind may not be used together