2020-05-01 23:57:34 +00:00
|
|
|
#![allow(unreachable_code)]
|
|
|
|
|
2020-04-09 14:03:09 +00:00
|
|
|
use async_graphql::*;
|
|
|
|
|
|
|
|
struct User {
|
|
|
|
id: ID,
|
|
|
|
}
|
|
|
|
|
2020-09-18 00:52:13 +00:00
|
|
|
#[Object(extends)]
|
2020-04-09 14:03:09 +00:00
|
|
|
impl User {
|
2020-09-28 09:44:00 +00:00
|
|
|
#[graphql(external)]
|
2020-04-09 14:03:09 +00:00
|
|
|
async fn id(&self) -> &ID {
|
|
|
|
&self.id
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn reviews(&self) -> Vec<Review> {
|
|
|
|
todo!()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Review;
|
|
|
|
|
2020-09-18 00:52:13 +00:00
|
|
|
#[Object]
|
2020-04-09 14:03:09 +00:00
|
|
|
impl Review {
|
|
|
|
async fn body(&self) -> String {
|
|
|
|
todo!()
|
|
|
|
}
|
|
|
|
|
2020-09-28 09:44:00 +00:00
|
|
|
#[graphql(provides = "username")]
|
2020-04-09 14:03:09 +00:00
|
|
|
async fn author(&self) -> User {
|
|
|
|
todo!()
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn product(&self) -> Product {
|
|
|
|
todo!()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Product {
|
|
|
|
upc: String,
|
|
|
|
}
|
|
|
|
|
2020-09-18 00:52:13 +00:00
|
|
|
#[Object(extends)]
|
2020-04-09 14:03:09 +00:00
|
|
|
impl Product {
|
2020-09-28 09:44:00 +00:00
|
|
|
#[graphql(external)]
|
2020-04-09 14:03:09 +00:00
|
|
|
async fn upc(&self) -> &str {
|
|
|
|
&self.upc
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn reviews(&self) -> Vec<Review> {
|
|
|
|
todo!()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct QueryRoot;
|
|
|
|
|
2020-09-18 00:52:13 +00:00
|
|
|
#[Object]
|
2020-04-09 14:03:09 +00:00
|
|
|
impl QueryRoot {
|
2020-09-28 09:44:00 +00:00
|
|
|
#[graphql(entity)]
|
2020-04-09 14:03:09 +00:00
|
|
|
async fn find_user_by_id(&self, id: ID) -> User {
|
|
|
|
User { id }
|
|
|
|
}
|
|
|
|
|
2020-09-28 09:44:00 +00:00
|
|
|
#[graphql(entity)]
|
2020-04-09 14:03:09 +00:00
|
|
|
async fn find_product_by_upc(&self, upc: String) -> Product {
|
|
|
|
Product { upc }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[async_std::test]
|
|
|
|
pub async fn test_federation() {
|
|
|
|
let schema = Schema::new(QueryRoot, EmptyMutation, EmptySubscription);
|
2020-05-01 23:57:34 +00:00
|
|
|
let query = r#"{
|
|
|
|
_entities(representations: [{__typename: "Product", upc: "B00005N5PF"}]) {
|
2020-04-09 14:03:09 +00:00
|
|
|
__typename
|
2020-05-01 23:57:34 +00:00
|
|
|
... on Product {
|
2020-04-09 14:03:09 +00:00
|
|
|
upc
|
2020-05-01 23:57:34 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}"#;
|
2020-04-09 14:03:09 +00:00
|
|
|
assert_eq!(
|
2020-09-12 09:29:52 +00:00
|
|
|
schema.execute(query).await.into_result().unwrap().data,
|
2020-10-12 02:17:05 +00:00
|
|
|
value!({
|
2020-04-09 14:03:09 +00:00
|
|
|
"_entities": [
|
|
|
|
{"__typename": "Product", "upc": "B00005N5PF"},
|
|
|
|
]
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|