juniper/macros/helper/mod.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
//! Helper traits and definitions for macros.
pub mod subscription;
use std::fmt;
use futures::future::{self, BoxFuture};
use crate::FieldError;
/// This trait is used by [`graphql_scalar!`] macro to retrieve [`Error`] type
/// from a [`Result`].
///
/// [`Error`]: Result::Error
/// [`graphql_scalar!`]: macro@crate::graphql_scalar
pub trait ExtractError {
/// Extracted [`Error`] type of this [`Result`].
///
/// [`Error`]: Result::Error
type Error;
}
impl<T, E> ExtractError for Result<T, E> {
type Error = E;
}
/// Wraps `msg` with [`Display`] implementation into opaque [`Send`] [`Future`]
/// which immediately resolves into [`FieldError`].
pub fn err_fut<'ok, D, Ok, S>(msg: D) -> BoxFuture<'ok, Result<Ok, FieldError<S>>>
where
D: fmt::Display,
Ok: Send + 'ok,
S: Send + 'static,
{
Box::pin(future::err(FieldError::from(msg)))
}
/// Generates a [`FieldError`] for the given Rust type expecting to have
/// [`GraphQLType::name`].
///
/// [`GraphQLType::name`]: crate::GraphQLType::name
pub fn err_unnamed_type<S>(name: &str) -> FieldError<S> {
FieldError::from(format!(
"Expected `{name}` type to implement `GraphQLType::name`",
))
}
/// Returns a [`future::err`] wrapping the [`err_unnamed_type`].
pub fn err_unnamed_type_fut<'ok, Ok, S>(name: &str) -> BoxFuture<'ok, Result<Ok, FieldError<S>>>
where
Ok: Send + 'ok,
S: Send + 'static,
{
Box::pin(future::err(err_unnamed_type(name)))
}