dynamic_graphql/
any_box.rs1use 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}