pub trait GraphQLValue<S = DefaultScalarValue>where
S: ScalarValue,{
type Context;
type TypeInfo;
// Required method
fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>;
// Provided methods
fn resolve_field(
&self,
_info: &Self::TypeInfo,
_field_name: &str,
_arguments: &Arguments<'_, S>,
_executor: &Executor<'_, '_, Self::Context, S>,
) -> ExecutionResult<S> { ... }
fn resolve_into_type(
&self,
info: &Self::TypeInfo,
type_name: &str,
selection_set: Option<&[Selection<'_, S>]>,
executor: &Executor<'_, '_, Self::Context, S>,
) -> ExecutionResult<S> { ... }
fn concrete_type_name(
&self,
context: &Self::Context,
info: &Self::TypeInfo,
) -> String { ... }
fn resolve(
&self,
info: &Self::TypeInfo,
selection_set: Option<&[Selection<'_, S>]>,
executor: &Executor<'_, '_, Self::Context, S>,
) -> ExecutionResult<S> { ... }
}
Expand description
Primary trait used to resolve GraphQL values.
All the convenience macros ultimately expand into an implementation of this trait for the given type. The macros remove duplicated definitions of fields and arguments, and add type checks on all resolving functions automatically. This can all be done manually too.
GraphQLValue
provides some convenience methods for you, in the form of optional trait
methods. The type_name
method is mandatory, but other than that, it depends on what type
you’re exposing:
- Scalars, enums, lists and non-null wrappers only require
resolve
. - Interfaces and objects require
resolve_field
orresolve
if you want to implement a custom resolution logic (probably not). - Interfaces and unions require
resolve_into_type
andconcrete_type_name
. - Input objects do not require anything.
§Object safety
This trait is object safe, therefore may be turned into a trait object and used for resolving GraphQL values even when a concrete Rust type is erased.
§Example
This trait is intended to be used in a conjunction with a GraphQLType
trait. See the example
in the documentation of a GraphQLType
trait.
Required Associated Types§
Sourcetype Context
type Context
Context type for this GraphQLValue
.
It’s threaded through a query execution to all affected nodes, and can be used to hold common data, e.g. database connections or request session information.
Sourcetype TypeInfo
type TypeInfo
Type that may carry additional schema information for this GraphQLValue
.
It can be used to implement a schema that is partly dynamic, meaning that it can use information that is not known at compile time, for instance by reading it from a configuration file at startup.
Required Methods§
Sourcefn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>
fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>
Returns name of the GraphQLType
exposed by this GraphQLValue
.
This function will be called multiple times during a query execution. It must not perform any calculation and always return the same value.
Usually, it should just call a GraphQLType::name
inside.
Provided Methods§
Sourcefn resolve_field(
&self,
_info: &Self::TypeInfo,
_field_name: &str,
_arguments: &Arguments<'_, S>,
_executor: &Executor<'_, '_, Self::Context, S>,
) -> ExecutionResult<S>
fn resolve_field( &self, _info: &Self::TypeInfo, _field_name: &str, _arguments: &Arguments<'_, S>, _executor: &Executor<'_, '_, Self::Context, S>, ) -> ExecutionResult<S>
Resolves the value of a single field on this GraphQLValue
.
The arguments
object contains all the specified arguments, with default values being
substituted for the ones not provided by the query.
The executor
can be used to drive selections into sub-objects.
§Panics
The default implementation panics.
Sourcefn resolve_into_type(
&self,
info: &Self::TypeInfo,
type_name: &str,
selection_set: Option<&[Selection<'_, S>]>,
executor: &Executor<'_, '_, Self::Context, S>,
) -> ExecutionResult<S>
fn resolve_into_type( &self, info: &Self::TypeInfo, type_name: &str, selection_set: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S>, ) -> ExecutionResult<S>
Resolves this GraphQLValue
(being an interface or an union) into a concrete
downstream object type.
Tries to resolve this GraphQLValue
into the provided type_name
. If the type matches,
then passes the instance along to Executor::resolve
.
§Panics
The default implementation panics.
Sourcefn concrete_type_name(
&self,
context: &Self::Context,
info: &Self::TypeInfo,
) -> String
fn concrete_type_name( &self, context: &Self::Context, info: &Self::TypeInfo, ) -> String
Returns the concrete GraphQLType
name for this GraphQLValue
being an interface,
an union or an object.
§Panics
The default implementation panics.
Sourcefn resolve(
&self,
info: &Self::TypeInfo,
selection_set: Option<&[Selection<'_, S>]>,
executor: &Executor<'_, '_, Self::Context, S>,
) -> ExecutionResult<S>
fn resolve( &self, info: &Self::TypeInfo, selection_set: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S>, ) -> ExecutionResult<S>
Resolves the provided selection_set
against this GraphQLValue
.
For non-object types, the selection_set
will be None
and the value should simply
be returned.
For objects, all fields in the selection_set
should be resolved. The default
implementation uses GraphQLValue::resolve_field
to resolve all fields, including those
through a fragment expansion.
Since the GraphQL spec specifies that errors during field processing should result in
a null-value, this might return Ok(Null)
in case of a failure. Errors are recorded
internally.
§Panics
The default implementation panics, if selection_set
is None
.