From 18e10147887777bb39b31d506625d76481ffbfdf Mon Sep 17 00:00:00 2001 From: sunli Date: Sat, 7 Mar 2020 11:21:56 +0800 Subject: [PATCH] fix some bugs --- async-graphql-derive/src/args.rs | 6 ++++++ async-graphql-derive/src/interface.rs | 24 ++++++++++++++---------- examples/starwars/model.rs | 4 ---- src/resolver.rs | 2 -- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/async-graphql-derive/src/args.rs b/async-graphql-derive/src/args.rs index 27c0893b..1a698103 100644 --- a/async-graphql-derive/src/args.rs +++ b/async-graphql-derive/src/args.rs @@ -555,6 +555,7 @@ pub struct InterfaceField { pub ty: Type, pub args: Vec, pub deprecation: Option, + pub context: bool, } impl InterfaceField { @@ -565,9 +566,13 @@ impl InterfaceField { let mut ty = None; let mut args = Vec::new(); let mut deprecation = None; + let mut context = false; for meta in &ls.nested { match meta { + NestedMeta::Meta(Meta::Path(p)) if p.is_ident("context") => { + context = true; + } NestedMeta::Meta(Meta::NameValue(nv)) => { if nv.path.is_ident("name") { if let syn::Lit::Str(lit) = &nv.lit { @@ -642,6 +647,7 @@ impl InterfaceField { ty: ty.unwrap(), args, deprecation, + context, }) } } diff --git a/async-graphql-derive/src/interface.rs b/async-graphql-derive/src/interface.rs index 0182c10e..f18129f1 100644 --- a/async-graphql-derive/src/interface.rs +++ b/async-graphql-derive/src/interface.rs @@ -7,8 +7,6 @@ use proc_macro2::{Ident, Span}; use quote::quote; use syn::{Data, DeriveInput, Error, Fields, Result, Type}; -// todo: Context params - pub fn generate(interface_args: &args::Interface, input: &DeriveInput) -> Result { let crate_name = get_crate_name(interface_args.internal); let ident = &input.ident; @@ -52,14 +50,14 @@ pub fn generate(interface_args: &args::Interface, input: &DeriveInput) -> Result } }); registry_types.push(quote! { - <#p as async_graphql::GQLType>::create_type_info(registry); - registry.add_implements(&<#p as GQLType>::type_name(), #gql_typename); + <#p as #crate_name::GQLType>::create_type_info(registry); + registry.add_implements(&<#p as #crate_name::GQLType>::type_name(), #gql_typename); }); possible_types.push(quote! { - <#p as async_graphql::GQLType>::type_name().to_string() + <#p as #crate_name::GQLType>::type_name().to_string() }); inline_fragment_resolvers.push(quote! { - if name == <#p as async_graphql::GQLType>::type_name() { + if name == <#p as #crate_name::GQLType>::type_name() { if let #ident::#enum_name(obj) = self { #crate_name::do_resolve(ctx, obj, result).await?; } @@ -82,6 +80,7 @@ pub fn generate(interface_args: &args::Interface, input: &DeriveInput) -> Result ty, args, deprecation, + context, } in &interface_args.fields { let method_name = Ident::new( @@ -94,6 +93,11 @@ pub fn generate(interface_args: &args::Interface, input: &DeriveInput) -> Result let mut get_params = Vec::new(); let mut schema_args = Vec::new(); + if *context { + decl_params.push(quote! { ctx: &#crate_name::Context<'_> }); + use_params.push(quote! { ctx }); + } + for InterfaceFieldArgument { name, desc, @@ -103,7 +107,7 @@ pub fn generate(interface_args: &args::Interface, input: &DeriveInput) -> Result { let ident = Ident::new(name, Span::call_site()); decl_params.push(quote! { #ident: #ty }); - use_params.push(ident.clone()); + use_params.push(quote! { #ident }); let param_default = match &default { Some(default) => { @@ -206,15 +210,15 @@ pub fn generate(interface_args: &args::Interface, input: &DeriveInput) -> Result } impl #generics #crate_name::GQLType for #ident #generics { - fn type_name() -> Cow<'static, str> { - Cow::Borrowed(#gql_typename) + fn type_name() -> std::borrow::Cow<'static, str> { + std::borrow::Cow::Borrowed(#gql_typename) } fn create_type_info(registry: &mut #crate_name::registry::Registry) -> String { registry.create_type::(|registry| { #(#registry_types)* - async_graphql::registry::Type::Interface { + #crate_name::registry::Type::Interface { name: #gql_typename, description: #desc, fields: vec![#(#schema_fields),*], diff --git a/examples/starwars/model.rs b/examples/starwars/model.rs index 5bbd4a9c..03d3bb09 100644 --- a/examples/starwars/model.rs +++ b/examples/starwars/model.rs @@ -1,6 +1,4 @@ use super::StarWars; -use async_graphql::GQLType; -use std::borrow::Cow; #[async_graphql::Enum(desc = "One of the films in the Star Wars Trilogy")] #[allow(non_camel_case_types)] @@ -148,8 +146,6 @@ impl QueryRoot { } } -//////////////////////////////////////////////////////////////////////////////////////////////// - #[async_graphql::Interface( field(name = "id", type = "&str"), field(name = "name", type = "&str"), diff --git a/src/resolver.rs b/src/resolver.rs index d2e34f95..0be5a4e9 100644 --- a/src/resolver.rs +++ b/src/resolver.rs @@ -73,8 +73,6 @@ impl<'a, T: GQLObject + Send + Sync> Resolver<'a, T> { self.result, ) .await?; - } else { - todo!() } } }