Trait juniper::GraphQLValue

source ·
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:

§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§

source

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.

source

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§

source

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§

source

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.

source

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.

source

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.

source

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.

Implementations on Foreign Types§

source§

impl<'e, S, T> GraphQLValue<S> for &'e T
where S: ScalarValue, T: GraphQLValue<S> + ?Sized,

§

type Context = <T as GraphQLValue<S>>::Context

§

type TypeInfo = <T as GraphQLValue<S>>::TypeInfo

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve_into_type( &self, info: &Self::TypeInfo, name: &str, selection_set: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

fn resolve_field( &self, info: &Self::TypeInfo, field: &str, args: &Arguments<'_, S>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

fn resolve( &self, info: &Self::TypeInfo, selection_set: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

impl<S> GraphQLValue<S> for str
where S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, _: &(), _: Option<&[Selection<'_, S>]>, _: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

impl<S, T> GraphQLValue<S> for Option<T>
where S: ScalarValue, T: GraphQLValue<S>,

§

type Context = <T as GraphQLValue<S>>::Context

§

type TypeInfo = <T as GraphQLValue<S>>::TypeInfo

source§

fn type_name(&self, _: &Self::TypeInfo) -> Option<&'static str>

source§

fn resolve( &self, info: &Self::TypeInfo, _: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

impl<S, T> GraphQLValue<S> for [T]
where S: ScalarValue, T: GraphQLValue<S>,

§

type Context = <T as GraphQLValue<S>>::Context

§

type TypeInfo = <T as GraphQLValue<S>>::TypeInfo

source§

fn type_name(&self, _: &Self::TypeInfo) -> Option<&'static str>

source§

fn resolve( &self, info: &Self::TypeInfo, _: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

impl<S, T> GraphQLValue<S> for Box<T>
where T: GraphQLValue<S> + ?Sized, S: ScalarValue,

§

type Context = <T as GraphQLValue<S>>::Context

§

type TypeInfo = <T as GraphQLValue<S>>::TypeInfo

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve_into_type( &self, info: &Self::TypeInfo, name: &str, selection_set: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

fn resolve_field( &self, info: &Self::TypeInfo, field: &str, args: &Arguments<'_, S>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

fn resolve( &self, info: &Self::TypeInfo, selection_set: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

impl<S, T> GraphQLValue<S> for Arc<T>
where S: ScalarValue, T: GraphQLValue<S> + ?Sized,

§

type Context = <T as GraphQLValue<S>>::Context

§

type TypeInfo = <T as GraphQLValue<S>>::TypeInfo

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve_into_type( &self, info: &Self::TypeInfo, name: &str, selection_set: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

fn resolve_field( &self, info: &Self::TypeInfo, field: &str, args: &Arguments<'_, S>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

fn resolve( &self, info: &Self::TypeInfo, selection_set: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

impl<S, T> GraphQLValue<S> for Vec<T>
where T: GraphQLValue<S>, S: ScalarValue,

§

type Context = <T as GraphQLValue<S>>::Context

§

type TypeInfo = <T as GraphQLValue<S>>::TypeInfo

source§

fn type_name(&self, _: &Self::TypeInfo) -> Option<&'static str>

source§

fn resolve( &self, info: &Self::TypeInfo, _: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

impl<S, T, const N: usize> GraphQLValue<S> for [T; N]
where S: ScalarValue, T: GraphQLValue<S>,

§

type Context = <T as GraphQLValue<S>>::Context

§

type TypeInfo = <T as GraphQLValue<S>>::TypeInfo

source§

fn type_name(&self, _: &Self::TypeInfo) -> Option<&'static str>

source§

fn resolve( &self, info: &Self::TypeInfo, _: Option<&[Selection<'_, S>]>, executor: &Executor<'_, '_, Self::Context, S> ) -> ExecutionResult<S>

source§

impl<Tz, __S> GraphQLValue<__S> for DateTime<Tz>

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for Tz
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for bool
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for f64
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for i32
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for String
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for BigDecimal
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for DateTime
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for ObjectId
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for NaiveDate
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for NaiveDateTime
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for NaiveTime
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for Decimal
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for Date
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for OffsetDateTime
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for PrimitiveDateTime
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for Time
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for UtcOffset
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for Url
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

source§

impl<__S> GraphQLValue<__S> for Uuid
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>

source§

fn resolve( &self, info: &(), selection: Option<&[Selection<'_, __S>]>, executor: &Executor<'_, '_, Self::Context, __S> ) -> ExecutionResult<__S>

Implementors§

source§

impl<'a, S> GraphQLValue<S> for Argument<'a, S>
where S: ScalarValue + ScalarValue + 'a,

§

type Context = SchemaType<'a, S>

§

type TypeInfo = ()

source§

impl<'a, S> GraphQLValue<S> for Field<'a, S>
where S: ScalarValue + ScalarValue + 'a,

§

type Context = SchemaType<'a, S>

§

type TypeInfo = ()

source§

impl<'a, S> GraphQLValue<S> for SchemaType<'a, S>
where S: ScalarValue + ScalarValue + 'a,

§

type Context = SchemaType<'a, S>

§

type TypeInfo = ()

source§

impl<'a, S, QueryT, MutationT, SubscriptionT> GraphQLValue<S> for RootNode<'a, QueryT, MutationT, SubscriptionT, S>
where S: ScalarValue, QueryT: GraphQLType<S>, MutationT: GraphQLType<S, Context = QueryT::Context>, SubscriptionT: GraphQLType<S, Context = QueryT::Context>,

§

type Context = <QueryT as GraphQLValue<S>>::Context

§

type TypeInfo = <QueryT as GraphQLValue<S>>::TypeInfo

source§

impl<S, T> GraphQLValue<S> for Nullable<T>
where S: ScalarValue, T: GraphQLValue<S>,

§

type Context = <T as GraphQLValue<S>>::Context

§

type TypeInfo = <T as GraphQLValue<S>>::TypeInfo

source§

impl<S, T> GraphQLValue<S> for EmptyMutation<T>
where S: ScalarValue,

§

type Context = T

§

type TypeInfo = ()

source§

impl<S, T> GraphQLValue<S> for EmptySubscription<T>
where S: ScalarValue,

§

type Context = T

§

type TypeInfo = ()

source§

impl<__S> GraphQLValue<__S> for TypeKind
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

impl<__S> GraphQLValue<__S> for Episode
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

impl<__S> GraphQLValue<__S> for EnumValue
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

impl<__S> GraphQLValue<__S> for ID
where __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()

source§

impl<__S> GraphQLValue<__S> for Droid
where __S: ScalarValue,

source§

impl<__S> GraphQLValue<__S> for Human
where __S: ScalarValue,

source§

impl<__S> GraphQLValue<__S> for Query
where __S: ScalarValue,

source§

impl<__S> GraphQLValue<__S> for Subscription
where __S: ScalarValue,

source§

impl<__S> GraphQLValue<__S> for CharacterValue
where __S: ScalarValue,