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

Associated Types

type Context[src]

Expand description

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]

Expand description

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]

Expand description

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]

Expand description

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]

Expand description

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]

Expand description

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]

Expand description

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

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

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

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

type Context = T::Context

type TypeInfo = T::TypeInfo

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

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

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

type Context = T::Context

type TypeInfo = T::TypeInfo

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

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

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

type Context = T::Context

type TypeInfo = T::TypeInfo

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

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

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

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

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

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

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

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

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

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

type Context = T::Context

type TypeInfo = T::TypeInfo

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

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

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = ()

type TypeInfo = ()

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

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

Loading content...

Implementors

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

type Context = SchemaType<'a, S>

type TypeInfo = ()

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

fn resolve_field(
    &self,
    _info: &(),
    field: &str,
    args: &Arguments<'_, S>,
    executor: &Executor<'_, '_, Self::Context, S>
) -> ExecutionResult<S>
[src]

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

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

type Context = ()

type TypeInfo = ()

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

fn resolve_field(
    &self,
    _info: &(),
    field: &str,
    args: &Arguments<'_, S>,
    executor: &Executor<'_, '_, Self::Context, S>
) -> ExecutionResult<S>
[src]

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

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

type Context = SchemaType<'a, S>

type TypeInfo = ()

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

fn resolve_field(
    &self,
    _info: &(),
    field: &str,
    args: &Arguments<'_, S>,
    executor: &Executor<'_, '_, Self::Context, S>
) -> ExecutionResult<S>
[src]

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

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

type Context = SchemaType<'a, S>

type TypeInfo = ()

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

fn resolve_field(
    &self,
    _info: &(),
    field: &str,
    args: &Arguments<'_, S>,
    executor: &Executor<'_, '_, Self::Context, S>
) -> ExecutionResult<S>
[src]

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

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

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

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

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

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

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

type Context = ()

type TypeInfo = ()

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

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

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

type Context = T::Context

type TypeInfo = T::TypeInfo

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

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

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

type Context = T

type TypeInfo = ()

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

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

type Context = T

type TypeInfo = ()

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

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

type Context = ()

type TypeInfo = ()

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

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

Loading content...