Trait juniper::GraphQLValue[][src]

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> { ... } }

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.

Associated Types

type Context[src]

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.

type TypeInfo[src]

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.

Loading content...

Required methods

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

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.

Loading content...

Provided methods

fn resolve_field(
    &self,
    _info: &Self::TypeInfo,
    _field_name: &str,
    _arguments: &Arguments<'_, S>,
    _executor: &Executor<'_, '_, Self::Context, S>
) -> ExecutionResult<S>
[src]

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.

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

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.

fn concrete_type_name(
    &self,
    context: &Self::Context,
    info: &Self::TypeInfo
) -> String
[src]

Returns the concrete GraphQLType name for this GraphQLValue being an interface, an union or an object.

Panics

The default implementation panics.

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

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.

Loading content...

Implementations on Foreign Types

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

type Context = T::Context

type TypeInfo = T::TypeInfo

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

type Context = T::Context

type TypeInfo = T::TypeInfo

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

type Context = T::Context

type TypeInfo = T::TypeInfo

impl<S, T: ?Sized> GraphQLValue<S> for Box<T> where
    T: GraphQLValue<S>,
    S: ScalarValue
[src]

type Context = T::Context

type TypeInfo = T::TypeInfo

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

type Context = T::Context

type TypeInfo = T::TypeInfo

impl<S, T: ?Sized> GraphQLValue<S> for Arc<T> where
    S: ScalarValue,
    T: GraphQLValue<S>, 
[src]

type Context = T::Context

type TypeInfo = T::TypeInfo

impl<S> GraphQLValue<S> for String where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for str where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for bool where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for i32 where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for f64 where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for DateTime<FixedOffset> where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for DateTime<Utc> where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for NaiveDate where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for NaiveDateTime where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for Url where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for Uuid where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for ObjectId where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

impl<S> GraphQLValue<S> for UtcDateTime where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

Loading content...

Implementors

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

type Context = SchemaType<'a, S>

type TypeInfo = ()

impl<'a, S> GraphQLValue<S> for EnumValue where
    S: ScalarValue + 'a, 
[src]

type Context = ()

type TypeInfo = ()

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

type Context = SchemaType<'a, S>

type TypeInfo = ()

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

type Context = SchemaType<'a, S>

type TypeInfo = ()

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>, 
[src]

type Context = QueryT::Context

type TypeInfo = QueryT::TypeInfo

impl<S> GraphQLValue<S> for ID where
    S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

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

type Context = T::Context

type TypeInfo = T::TypeInfo

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

type Context = T

type TypeInfo = ()

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

type Context = T

type TypeInfo = ()

impl<__S> GraphQLValue<__S> for TypeKind where
    __S: ScalarValue
[src]

type Context = ()

type TypeInfo = ()

Loading content...