2021-03-17 12:51:30 +00:00
|
|
|
use async_graphql::*;
|
2021-07-03 16:00:16 +00:00
|
|
|
use core::marker::PhantomData;
|
2021-03-17 12:51:30 +00:00
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
pub async fn test_complex_object() {
|
|
|
|
#[derive(SimpleObject)]
|
|
|
|
#[graphql(complex)]
|
|
|
|
struct MyObj {
|
|
|
|
a: i32,
|
|
|
|
b: i32,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[ComplexObject]
|
|
|
|
impl MyObj {
|
|
|
|
async fn c(&self) -> i32 {
|
|
|
|
self.a + self.b
|
|
|
|
}
|
2021-04-23 02:25:00 +00:00
|
|
|
|
|
|
|
async fn d(&self, v: i32) -> i32 {
|
|
|
|
self.a + self.b + v
|
|
|
|
}
|
2021-03-17 12:51:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Interface)]
|
|
|
|
#[graphql(
|
|
|
|
field(name = "a", type = "&i32"),
|
|
|
|
field(name = "b", type = "&i32"),
|
2021-04-23 02:25:00 +00:00
|
|
|
field(name = "c", type = "i32"),
|
|
|
|
field(name = "d", type = "i32", arg(name = "v", type = "i32"))
|
2021-03-17 12:51:30 +00:00
|
|
|
)]
|
|
|
|
enum ObjInterface {
|
|
|
|
MyObj(MyObj),
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Query;
|
|
|
|
|
|
|
|
#[Object]
|
|
|
|
impl Query {
|
|
|
|
async fn obj(&self) -> MyObj {
|
|
|
|
MyObj { a: 10, b: 20 }
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn obj2(&self) -> ObjInterface {
|
|
|
|
MyObj { a: 10, b: 20 }.into()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-04-23 02:25:00 +00:00
|
|
|
let query = "{ obj { a b c d(v:100) } obj2 { a b c d(v:200) } }";
|
2021-03-17 12:51:30 +00:00
|
|
|
let schema = Schema::new(Query, EmptyMutation, EmptySubscription);
|
|
|
|
assert_eq!(
|
|
|
|
schema.execute(query).await.data,
|
|
|
|
value!({
|
|
|
|
"obj": {
|
|
|
|
"a": 10,
|
|
|
|
"b": 20,
|
|
|
|
"c": 30,
|
2021-04-23 02:25:00 +00:00
|
|
|
"d": 130,
|
2021-03-17 12:51:30 +00:00
|
|
|
},
|
|
|
|
"obj2": {
|
|
|
|
"a": 10,
|
|
|
|
"b": 20,
|
|
|
|
"c": 30,
|
2021-04-23 02:25:00 +00:00
|
|
|
"d": 230,
|
2021-03-17 12:51:30 +00:00
|
|
|
}
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
2021-07-03 16:00:16 +00:00
|
|
|
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
pub async fn test_complex_object_with_generic_context_data() {
|
|
|
|
trait MyData: Send + Sync {
|
|
|
|
fn answer(&self) -> i64;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct DefaultMyData {}
|
|
|
|
|
|
|
|
impl MyData for DefaultMyData {
|
|
|
|
fn answer(&self) -> i64 { 42 }
|
|
|
|
}
|
|
|
|
|
|
|
|
struct MyQuery<D: MyData> {
|
|
|
|
marker: PhantomData<D>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[Object]
|
|
|
|
impl<D> MyQuery<D> where D: 'static + MyData {
|
|
|
|
#[graphql(skip)]
|
|
|
|
pub fn new() -> Self {
|
|
|
|
Self { marker: PhantomData }
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn obj(&self, ctx: &Context<'_>) -> MyObject<D> {
|
|
|
|
MyObject::new(ctx.data_unchecked::<D>().answer())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(SimpleObject, Debug, Clone, Hash, Eq, PartialEq)]
|
|
|
|
#[graphql(complex)]
|
|
|
|
struct MyObject<D: MyData> {
|
|
|
|
my_val: i64,
|
|
|
|
#[graphql(skip)]
|
|
|
|
marker: PhantomData<D>,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[ComplexObject]
|
|
|
|
impl<D: MyData> MyObject<D> {
|
|
|
|
#[graphql(skip)]
|
|
|
|
pub fn new(my_val: i64) -> Self {
|
|
|
|
Self { my_val, marker: PhantomData }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let schema = Schema::build(MyQuery::<DefaultMyData>::new(), EmptyMutation, EmptySubscription)
|
|
|
|
.data(DefaultMyData {})
|
|
|
|
.finish();
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
schema.execute("{ obj { myVal } }").await.data,
|
|
|
|
value!({
|
|
|
|
"obj": {
|
|
|
|
"myVal": 42,
|
|
|
|
}
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|