Implemented OutputValueType for Box<T> and Arc<T>

This commit is contained in:
sunli 2020-04-25 14:51:26 +08:00
parent 03d98993f7
commit 85f3bbe3af

View File

@ -5,6 +5,7 @@ use graphql_parser::Pos;
use std::borrow::Cow;
use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
/// Represents a GraphQL type
///
@ -269,3 +270,47 @@ impl<T: OutputValueType + Send + Sync> OutputValueType for &T {
T::resolve(*value, ctx, pos).await
}
}
impl<T: Type + Send + Sync> Type for Box<T> {
fn type_name() -> Cow<'static, str> {
T::type_name()
}
fn create_type_info(registry: &mut Registry) -> String {
T::create_type_info(registry)
}
}
#[async_trait::async_trait]
impl<T: OutputValueType + Send + Sync> OutputValueType for Box<T> {
#[allow(clippy::trivially_copy_pass_by_ref)]
async fn resolve(
value: &Self,
ctx: &ContextSelectionSet<'_>,
pos: Pos,
) -> Result<serde_json::Value> {
T::resolve(&*value, ctx, pos).await
}
}
impl<T: Type + Send + Sync> Type for Arc<T> {
fn type_name() -> Cow<'static, str> {
T::type_name()
}
fn create_type_info(registry: &mut Registry) -> String {
T::create_type_info(registry)
}
}
#[async_trait::async_trait]
impl<T: OutputValueType + Send + Sync> OutputValueType for Arc<T> {
#[allow(clippy::trivially_copy_pass_by_ref)]
async fn resolve(
value: &Self,
ctx: &ContextSelectionSet<'_>,
pos: Pos,
) -> Result<serde_json::Value> {
T::resolve(&*value, ctx, pos).await
}
}