dynamic_graphql/
any_box.rs

1use std::any::Any;
2
3use async_graphql::Context;
4use async_graphql::dynamic::FieldValue;
5
6use crate::resolve::ResolveOwned;
7
8pub enum AnyBox<'a> {
9    Owned(Box<dyn Any + Send + Sync>, String),
10    Borrowed(&'a (dyn Any + Send + Sync), String),
11}
12
13impl<'a> AnyBox<'a> {
14    pub fn new_owned<T: Any + Send + Sync>(value: T, ty: String) -> Self {
15        Self::Owned(Box::new(value), ty)
16    }
17    pub fn new_borrowed<T: Any + Send + Sync + Sized>(value: &'a T, ty: String) -> Self {
18        Self::Borrowed(value, ty)
19    }
20}
21
22impl<'a> ResolveOwned<'a> for AnyBox<'a> {
23    fn resolve_owned(self, _ctx: &Context) -> async_graphql::Result<Option<FieldValue<'a>>> {
24        match self {
25            AnyBox::Owned(obj, name) => Ok(Some(FieldValue::boxed_any(obj).with_type(name))),
26            AnyBox::Borrowed(obj, name) => Ok(Some(FieldValue::borrowed_any(obj).with_type(name))),
27        }
28    }
29}