Fix interface downcasting. #330
This commit is contained in:
parent
c7334100bb
commit
734b43b613
|
@ -228,7 +228,7 @@ pub fn generate(interface_args: &args::Interface) -> GeneratorResult<TokenStream
|
||||||
|
|
||||||
for enum_name in &enum_names {
|
for enum_name in &enum_names {
|
||||||
calls.push(quote! {
|
calls.push(quote! {
|
||||||
#ident::#enum_name(obj) => obj.#method_name(#(#use_params),*).await
|
#ident::#enum_name(obj) => obj.#method_name(#(#use_params),*).await.map(::std::convert::Into::into)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -397,3 +397,79 @@ pub async fn test_interface_implement_other_interface() {
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[async_std::test]
|
||||||
|
pub async fn test_issue_330() {
|
||||||
|
#[derive(Interface)]
|
||||||
|
#[graphql(field(
|
||||||
|
desc = "The code represented as a number.",
|
||||||
|
name = "number",
|
||||||
|
type = "String"
|
||||||
|
))]
|
||||||
|
pub enum Code {
|
||||||
|
Barcode(Barcode),
|
||||||
|
Qrcode(Qrcode),
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Barcode(String);
|
||||||
|
|
||||||
|
#[Object]
|
||||||
|
impl Barcode {
|
||||||
|
pub async fn number(&self) -> String {
|
||||||
|
format!("barcode:{}", self.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Qrcode(String);
|
||||||
|
|
||||||
|
#[Object]
|
||||||
|
impl Qrcode {
|
||||||
|
pub async fn number(&self) -> String {
|
||||||
|
format!("qrcode:{}", self.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Interface)]
|
||||||
|
#[graphql(field(desc = "The article number.", name = "number", type = "Code"))]
|
||||||
|
pub enum Article {
|
||||||
|
Book(Book),
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Book {
|
||||||
|
code: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[Object]
|
||||||
|
impl Book {
|
||||||
|
pub async fn number(&self) -> Barcode {
|
||||||
|
Barcode(self.code.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Query;
|
||||||
|
|
||||||
|
#[Object]
|
||||||
|
impl Query {
|
||||||
|
pub async fn book(&self) -> Article {
|
||||||
|
Book {
|
||||||
|
code: "123456".to_string(),
|
||||||
|
}
|
||||||
|
.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let schema = Schema::new(Query, EmptyMutation, EmptySubscription);
|
||||||
|
assert_eq!(
|
||||||
|
schema
|
||||||
|
.execute("{ book { number { number } } }")
|
||||||
|
.await
|
||||||
|
.into_result()
|
||||||
|
.unwrap()
|
||||||
|
.data,
|
||||||
|
value!({
|
||||||
|
"book": {
|
||||||
|
"number": { "number": "barcode:123456" }
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user