From 1b173b758830b5587d75e642b37defc706b111dd Mon Sep 17 00:00:00 2001 From: Sunli Date: Tue, 29 Jun 2021 09:30:26 +0800 Subject: [PATCH] Allows to get the actual field name and alias in `ResolveInfo`. #551 --- derive/src/subscription.rs | 2 ++ src/extensions/mod.rs | 6 ++++++ src/resolver_utils/container.rs | 6 ++++++ src/resolver_utils/list.rs | 2 ++ 4 files changed, 16 insertions(+) diff --git a/derive/src/subscription.rs b/derive/src/subscription.rs index 520da686..7cd198b4 100644 --- a/derive/src/subscription.rs +++ b/derive/src/subscription.rs @@ -365,6 +365,8 @@ pub fn generate( path_node: ctx_selection_set.path_node.as_ref().unwrap(), parent_type: #gql_typename, return_type: &<<#stream_ty as #crate_name::futures_util::stream::Stream>::Item as #crate_name::Type>::qualified_type_name(), + name: field.node.name.node.as_str(), + alias: field.node.alias.as_ref().map(|alias| alias.node.as_str()), }; let resolve_fut = async { #crate_name::OutputType::resolve(&msg, &ctx_selection_set, &*field) diff --git a/src/extensions/mod.rs b/src/extensions/mod.rs index b583b1b6..40aec1e9 100644 --- a/src/extensions/mod.rs +++ b/src/extensions/mod.rs @@ -103,6 +103,12 @@ pub struct ResolveInfo<'a> { /// Current return type, is qualified name. pub return_type: &'a str, + + /// Current field name + pub name: &'a str, + + /// Current field alias + pub alias: Option<&'a str>, } type RequestFut<'a> = &'a mut (dyn Future + Send + Unpin); diff --git a/src/resolver_utils/container.rs b/src/resolver_utils/container.rs index 1fcfb274..dfe30795 100644 --- a/src/resolver_utils/container.rs +++ b/src/resolver_utils/container.rs @@ -204,6 +204,12 @@ impl<'a> Fields<'a> { )); } }, + name: field.node.name.node.as_str(), + alias: field + .node + .alias + .as_ref() + .map(|alias| alias.node.as_str()), }; let resolve_fut = root.resolve_field(&ctx_field); diff --git a/src/resolver_utils/list.rs b/src/resolver_utils/list.rs index d32a4498..f5b05976 100644 --- a/src/resolver_utils/list.rs +++ b/src/resolver_utils/list.rs @@ -23,6 +23,8 @@ pub async fn resolve_list<'a, T: OutputType + 'a>( path_node: ctx_idx.path_node.as_ref().unwrap(), parent_type: &Vec::::type_name(), return_type: &T::qualified_type_name(), + name: field.node.name.node.as_str(), + alias: field.node.alias.as_ref().map(|alias| alias.node.as_str()), }; let resolve_fut = async { OutputType::resolve(&item, &ctx_idx, field)