Trait juniper::GraphQLValue

source ·
pub trait GraphQLValue<S = DefaultScalarValue>where
    S: ScalarValue,
{ type Context; type TypeInfo; fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str>; 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<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 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> 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<'e, S, T> GraphQLValue<S> for &'e Twhere
    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 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> GraphQLValue<S> for Stringwhere
    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 strwhere
    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> GraphQLValue<S> for boolwhere
    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 i32where
    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 f64where
    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<FixedOffset>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<Utc>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 NaiveDatewhere
    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 NaiveDateTimewhere
    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 Urlwhere
    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 Uuidwhere
    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 ObjectIdwhere
    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 UtcDateTimewhere
    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 + 'a,

§

type Context = SchemaType<'a, S>

§

type TypeInfo = ()

source§

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

§

type Context = ()

§

type TypeInfo = ()

source§

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

§

type Context = SchemaType<'a, S>

§

type TypeInfo = ()

source§

impl<'a, S> GraphQLValue<S> for SchemaType<'a, S>where
    S: 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> GraphQLValue<S> for IDwhere
    S: ScalarValue,

§

type Context = ()

§

type 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 TypeKindwhere
    __S: ScalarValue,

§

type Context = ()

§

type TypeInfo = ()