From 734b43b613f0dbb8701181c1d1487509f27e6fb7 Mon Sep 17 00:00:00 2001 From: Sunli Date: Sat, 31 Oct 2020 08:58:54 +0800 Subject: [PATCH] Fix interface downcasting. #330 --- derive/src/interface.rs | 2 +- tests/interface.rs | 76 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/derive/src/interface.rs b/derive/src/interface.rs index 458b543d..07b65343 100644 --- a/derive/src/interface.rs +++ b/derive/src/interface.rs @@ -228,7 +228,7 @@ pub fn generate(interface_args: &args::Interface) -> GeneratorResult obj.#method_name(#(#use_params),*).await + #ident::#enum_name(obj) => obj.#method_name(#(#use_params),*).await.map(::std::convert::Into::into) }); } diff --git a/tests/interface.rs b/tests/interface.rs index ad752032..12aaa66f 100644 --- a/tests/interface.rs +++ b/tests/interface.rs @@ -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" } + } + }) + ); +}