diff --git a/src/resolver_utils/container.rs b/src/resolver_utils/container.rs index 383ed01c..a47602d8 100644 --- a/src/resolver_utils/container.rs +++ b/src/resolver_utils/container.rs @@ -157,52 +157,68 @@ impl<'a> Fields<'a> { async move { let ctx_field = ctx.with_field(field); let field_name = ctx_field.item.node.response_key().node.clone(); - let ctx_extension = ExtensionContext { - schema_data: &ctx.schema_env.data, - query_data: &ctx.query_env.ctx_data, - }; - let resolve_info = ResolveInfo { - resolve_id: ctx_field.resolve_id, - path_node: ctx_field.path_node.as_ref().unwrap(), - parent_type: &T::type_name(), - return_type: match ctx_field - .schema_env - .registry - .types - .get(T::type_name().as_ref()) - .and_then(|ty| ty.field_by_name(field.node.name.node.as_str())) - .map(|field| &field.ty) - { - Some(ty) => &ty, - None => { - return Err(ServerError::new(format!( - r#"Cannot query field "{}" on type "{}"."#, - field_name, - T::type_name() - )) - .at(ctx_field.item.pos) - .path(PathSegment::Field(field_name.to_string()))); + let res = if ctx_field.query_env.extensions.is_empty() { + let ctx_extension = ExtensionContext { + schema_data: &ctx.schema_env.data, + query_data: &ctx.query_env.ctx_data, + }; + + let type_name = T::type_name(); + let resolve_info = ResolveInfo { + resolve_id: ctx_field.resolve_id, + path_node: ctx_field.path_node.as_ref().unwrap(), + parent_type: &type_name, + return_type: match ctx_field + .schema_env + .registry + .types + .get(type_name.as_ref()) + .and_then(|ty| { + ty.field_by_name(field.node.name.node.as_str()) + }) + .map(|field| &field.ty) + { + Some(ty) => &ty, + None => { + return Err(ServerError::new(format!( + r#"Cannot query field "{}" on type "{}"."#, + field_name, type_name + )) + .at(ctx_field.item.pos) + .path(PathSegment::Field(field_name.to_string()))); + } + }, + }; + + ctx_field + .query_env + .extensions + .resolve_start(&ctx_extension, &resolve_info); + + let res = match root.resolve_field(&ctx_field).await { + Ok(value) => Ok((field_name, value.unwrap_or_default())), + Err(e) => { + Err(e.path(PathSegment::Field(field_name.to_string()))) } - }, + } + .log_error(&ctx_extension, &ctx_field.query_env.extensions)?; + + ctx_field + .query_env + .extensions + .resolve_end(&ctx_extension, &resolve_info); + + res + } else { + match root.resolve_field(&ctx_field).await { + Ok(value) => Ok((field_name, value.unwrap_or_default())), + Err(e) => { + Err(e.path(PathSegment::Field(field_name.to_string()))) + } + }? }; - ctx_field - .query_env - .extensions - .resolve_start(&ctx_extension, &resolve_info); - - let res = match root.resolve_field(&ctx_field).await { - Ok(value) => Ok((field_name, value.unwrap())), - Err(e) => Err(e.path(PathSegment::Field(field_name.to_string()))), - } - .log_error(&ctx_extension, &ctx_field.query_env.extensions)?; - - ctx_field - .query_env - .extensions - .resolve_end(&ctx_extension, &resolve_info); - Ok(res) } }));