Open
Description
GraphQL-JS (the reference implementation) implements the values as an array of key->value.
This is done in order to allow parsing things like:
field(arg: { f: true, f: false })
And be able to have in the result [ {key: "f", value: true}, {key: "f", value: false }]
. Today it's just { f: false}
in graphql-parser
.
Where a field can be specified multiple times. In terms of parsing, it should be better to use the array.
The spec/graphql-js also implements a validation rule (UniqueInputFieldNamesRule
) to strictly enforce the existence of only one field.
Currently, this creates an ambiguity issue, since the consumer of the parsed Value
is getting the "latest" value specific.
Activity
[-]Avoid using BTreeMap in `Value::Object`?[/-][+]Avoid using BTreeMap in `Value::Object` and use `Vec<(String, Value::Object)` instead? [/+]tailhook commentedon Jan 10, 2022
This sounds like specifying key twice is useless, just we don't check for that speficically, right?
Can we just add a check to the parser and keep
BTreeMap
?dotansimha commentedon Jan 10, 2022
Yeah, but according to the spec, this is not a concern for the GraphQL parser - the parser needs to just parse both.
If a user executes the following query:
field(arg: { f: true, f: false })
, then the GraphQL response should be a validation error.With the current behavior, based on
BTreeMap
, we can't fail it since we don't know if the user-specified more than one. this means that runningfield(arg: { f: true, f: false })
becomes a valid query, while it isn't.I know this might be a breaking change to the API of the existing
struct
s, but it's important since it affects the GraphQL execution and determinism.@tailhook I can open a PR if that helps :)
validation
phase and rules graphprotocol/graph-node#3057tailhook commentedon Jan 12, 2022
I'm not sure yet. I wonder what others think on this.
/cc @graphql-rust/graphql-parser-maintainers, @graphql-rust/graphql-client-maintainers
dotansimha commentedon Jan 20, 2022
Hi @tailhook , any update on that? thanks!
mathstuf commentedon Jan 20, 2022
Is this something where the server wants the
Vec
to be able to tell the difference, but a client wantsBTreeMap
to avoid having invalid states it sends?dotansimha commentedon Jan 23, 2022
I think even from the point of view of a client, it's not a good practice to override keys? It might lead to unexpected behavior.
Also, this crate is not "taking a side" (client/server), so I believe it's better to just stick to the GraphQL spec/reference implementation when it comes to parsing and handling of those?
dotansimha commentedon Feb 6, 2022
@tailhook how should we proceed with this issue?