The default transport-specific client and tester extensions contained
their builder implementations, but it makes more sense the other way
around since the extensions are mainly about the builders they provide.
Now that the CHANGELOG generation and the release promotion tasks are
using external container images to perform tasks, we should not rely on
the ci-image to execute them.
GraphQlArgumentInitializer now keeps track of the argument path and
accumulates binding errors whose field set to the argument path.
In case of a binding error, it continues with other constructor args
or list elements, accumulating as many errors as possible, and raising
a BindingException at the end.
Closes gh-280
Use more qualified names [Web|Socket]GraphQlHandlerInterceptor to
differentiate with ClientGraphQlInterceptor and to align with other
types in the same package.
Rename the implementation classes Request[Input|Output] accordingly to
match the interfaces, and move them into the support package.
Create AbstractGraphQlResponse in the support package that
pre-implements response field access.
This leaves mainly contracts in the top-level package.
See gh-332
GraphQlResponseField is now extracted as a super type at the top-level
package and is exposed from GraphQlResponse. ClientGraphQlResponseField
extends this to provide decoding options.
The change ensures consistency with both GraphQlResponseField and
GraphQlResponseError accessible through GraphQlResponse, also making
both available for client and server side handling.
See gh-10
Instead of a simple check, looking for an associated field error at or
above the field, this method now more focused on finding the reason for
a failure when the field has no value.
This allows performing a more thorough search including cases when the
field error is at, above, or even below (e.g. non-null nested field
that bubbled up), in the end falling back on request errors (e.g.
failed response without any field errors).
Also, rename ResponseField to GraphQlResponseField and move to a
top-level class.
See gh-10
Add a String path representation making it easy to filter errors by
path using String comparison, and refine nullability.
Take advantage of the String error paths to simplify internal filtering
of error fields.
See gh-10
MapGraphQlResponse is a simple wrapper around the response map exposing
it as GraphQlResponse. It is now package private and made accessible
through a static factory method on GraphQlTransport.
See gh-10
If a field is null but without errors, i.e. declared optional in the
schema, it is more natural for toEntity to complete empty instead of
raising a FieldAccessException.
This aligns better with the execute method where handling the field
directly allows treating a null but valid field as optional.
See gh-10
This commit documents how to configure a custom className Extractor
strategy in the `ClassNameTypeResolver`. This also adds an example of a
`GraphQlSourceBuilderCustomizer` in Spring Boot.
Closes gh-334
hasValue is more meaningful because it means valid and with some value
that could be decoded, which in turn allows removing Nullable from
toEntity/List.
Or if there is no value, getError() can be used to differentiate
between a failed field vs a null field declared optional.
See gh-10