Add interface to implement another interface. #322
This commit is contained in:
parent
5f68861926
commit
33697ea19f
|
@ -85,7 +85,7 @@ pub fn generate(interface_args: &args::Interface) -> GeneratorResult<TokenStream
|
||||||
RemoveLifetime.visit_type_path_mut(&mut assert_ty);
|
RemoveLifetime.visit_type_path_mut(&mut assert_ty);
|
||||||
|
|
||||||
type_into_impls.push(quote! {
|
type_into_impls.push(quote! {
|
||||||
#crate_name::static_assertions::assert_impl_one!(#assert_ty: #crate_name::ObjectType);
|
#crate_name::static_assertions::assert_impl_any!(#assert_ty: #crate_name::ObjectType, #crate_name::InterfaceType);
|
||||||
|
|
||||||
#[allow(clippy::all, clippy::pedantic)]
|
#[allow(clippy::all, clippy::pedantic)]
|
||||||
impl #generics ::std::convert::From<#p> for #ident #generics {
|
impl #generics ::std::convert::From<#p> for #ident #generics {
|
||||||
|
@ -250,7 +250,7 @@ pub fn generate(interface_args: &args::Interface) -> GeneratorResult<TokenStream
|
||||||
|
|
||||||
methods.push(quote! {
|
methods.push(quote! {
|
||||||
#[inline]
|
#[inline]
|
||||||
async fn #method_name<'ctx>(&self, #(#decl_params),*) -> #crate_name::Result<#ty> {
|
pub async fn #method_name<'ctx>(&self, #(#decl_params),*) -> #crate_name::Result<#ty> {
|
||||||
match self {
|
match self {
|
||||||
#(#calls,)*
|
#(#calls,)*
|
||||||
}
|
}
|
||||||
|
|
|
@ -331,3 +331,69 @@ pub async fn test_interface_field_method() {
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[async_std::test]
|
||||||
|
pub async fn test_interface_implement_other_interface() {
|
||||||
|
#[derive(Interface)]
|
||||||
|
#[graphql(field(name = "id", type = "ID"))]
|
||||||
|
pub enum Entity {
|
||||||
|
Company(Company),
|
||||||
|
Organization(Organization),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Interface)]
|
||||||
|
#[graphql(field(name = "id", type = "ID"))]
|
||||||
|
pub enum Node {
|
||||||
|
Entity(Entity),
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Company {}
|
||||||
|
|
||||||
|
#[Object]
|
||||||
|
impl Company {
|
||||||
|
pub async fn id(&self) -> ID {
|
||||||
|
"88".into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Organization {}
|
||||||
|
|
||||||
|
#[Object]
|
||||||
|
impl Organization {
|
||||||
|
pub async fn id(&self) -> ID {
|
||||||
|
"99".into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Query;
|
||||||
|
|
||||||
|
#[Object]
|
||||||
|
impl Query {
|
||||||
|
async fn company(&self) -> Node {
|
||||||
|
Entity::Company(Company {}).into()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn organization(&self) -> Node {
|
||||||
|
Entity::Organization(Organization {}).into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let query = r#"
|
||||||
|
{
|
||||||
|
company { id }
|
||||||
|
organization { id }
|
||||||
|
}
|
||||||
|
"#;
|
||||||
|
let schema = Schema::new(Query, EmptyMutation, EmptySubscription);
|
||||||
|
assert_eq!(
|
||||||
|
schema.execute(query).await.into_result().unwrap().data,
|
||||||
|
value!({
|
||||||
|
"company": {
|
||||||
|
"id": "88",
|
||||||
|
},
|
||||||
|
"organization": {
|
||||||
|
"id": "99",
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user