Remove Deref for ContextBase

This commit is contained in:
Koxiaet 2020-09-12 17:42:15 +01:00
parent dcc7d1be14
commit b8add03d53
10 changed files with 42 additions and 55 deletions

View File

@ -237,13 +237,13 @@ pub fn generate(interface_args: &args::Interface, input: &DeriveInput) -> Result
let resolve_obj = quote! { let resolve_obj = quote! {
self.#method_name(#(#use_params),*).await. self.#method_name(#(#use_params),*).await.
map_err(|err| err.into_error_with_path(ctx.position(), ctx.path_node.as_ref()))? map_err(|err| err.into_error_with_path(ctx.item.pos, ctx.path_node.as_ref()))?
}; };
resolvers.push(quote! { resolvers.push(quote! {
if ctx.node.name.node == #name { if ctx.item.node.name.node == #name {
#(#get_params)* #(#get_params)*
let ctx_obj = ctx.with_selection_set(&ctx.node.selection_set); let ctx_obj = ctx.with_selection_set(&ctx.item.node.selection_set);
return #crate_name::OutputValueType::resolve(&#resolve_obj, &ctx_obj, ctx.item).await; return #crate_name::OutputValueType::resolve(&#resolve_obj, &ctx_obj, ctx.item).await;
} }
}); });
@ -307,9 +307,9 @@ pub fn generate(interface_args: &args::Interface, input: &DeriveInput) -> Result
async fn resolve_field(&self, ctx: &#crate_name::Context<'_>) -> #crate_name::Result<#crate_name::serde_json::Value> { async fn resolve_field(&self, ctx: &#crate_name::Context<'_>) -> #crate_name::Result<#crate_name::serde_json::Value> {
#(#resolvers)* #(#resolvers)*
Err(#crate_name::QueryError::FieldNotFound { Err(#crate_name::QueryError::FieldNotFound {
field_name: ctx.node.name.to_string(), field_name: ctx.item.node.name.to_string(),
object: #gql_typename.to_string(), object: #gql_typename.to_string(),
}.into_error(ctx.position())) }.into_error(ctx.item.pos))
} }
fn collect_all_fields<'a>(&'a self, ctx: &#crate_name::ContextSelectionSet<'a>, fields: &mut #crate_name::resolver_utils::Fields<'a>) -> #crate_name::Result<()> { fn collect_all_fields<'a>(&'a self, ctx: &#crate_name::ContextSelectionSet<'a>, fields: &mut #crate_name::resolver_utils::Fields<'a>) -> #crate_name::Result<()> {

View File

@ -151,7 +151,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
// requires // requires
requires_getter.push(quote! { requires_getter.push(quote! {
let #ident: #ty = #crate_name::InputValueType::parse(params.get(#name).cloned()). let #ident: #ty = #crate_name::InputValueType::parse(params.get(#name).cloned()).
map_err(|err| err.into_error(ctx.position(), <#ty as #crate_name::Type>::qualified_type_name()))?; map_err(|err| err.into_error(ctx.item.pos, <#ty as #crate_name::Type>::qualified_type_name()))?;
}); });
use_keys.push(ident); use_keys.push(ident);
} }
@ -177,7 +177,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
) )
.expect("invalid result type"); .expect("invalid result type");
} }
let do_find = quote! { self.#field_ident(ctx, #(#use_keys),*).await.map_err(|err| err.into_error(ctx.position()))? }; let do_find = quote! { self.#field_ident(ctx, #(#use_keys),*).await.map_err(|err| err.into_error(ctx.item.pos))? };
find_entities.push(( find_entities.push((
args.len(), args.len(),
@ -185,7 +185,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
if typename == &<#entity_type as #crate_name::Type>::type_name() { if typename == &<#entity_type as #crate_name::Type>::type_name() {
if let (#(#key_pat),*) = (#(#key_getter),*) { if let (#(#key_pat),*) = (#(#key_getter),*) {
#(#requires_getter)* #(#requires_getter)*
let ctx_obj = ctx.with_selection_set(&ctx.node.selection_set); let ctx_obj = ctx.with_selection_set(&ctx.item.node.selection_set);
return #crate_name::OutputValueType::resolve(&#do_find, &ctx_obj, ctx.item).await; return #crate_name::OutputValueType::resolve(&#do_find, &ctx_obj, ctx.item).await;
} }
} }
@ -400,7 +400,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
let resolve_obj = quote! { let resolve_obj = quote! {
{ {
let res = self.#field_ident(ctx, #(#use_params),*).await; let res = self.#field_ident(ctx, #(#use_params),*).await;
res.map_err(|err| err.into_error_with_path(ctx.position(), ctx.path_node.as_ref()))? res.map_err(|err| err.into_error_with_path(ctx.item.pos, ctx.path_node.as_ref()))?
} }
}; };
@ -408,20 +408,20 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
.guard .guard
.map(|guard| quote! { .map(|guard| quote! {
#guard.check(ctx).await #guard.check(ctx).await
.map_err(|err| err.into_error_with_path(ctx.position(), ctx.path_node.as_ref()))?; .map_err(|err| err.into_error_with_path(ctx.item.pos, ctx.path_node.as_ref()))?;
}); });
let post_guard = field let post_guard = field
.post_guard .post_guard
.map(|guard| quote! { .map(|guard| quote! {
#guard.check(ctx, &res).await #guard.check(ctx, &res).await
.map_err(|err| err.into_error_with_path(ctx.position(), ctx.path_node.as_ref()))?; .map_err(|err| err.into_error_with_path(ctx.item.pos, ctx.path_node.as_ref()))?;
}); });
resolvers.push(quote! { resolvers.push(quote! {
if ctx.node.name.node == #field_name { if ctx.item.node.name.node == #field_name {
#(#get_params)* #(#get_params)*
#guard #guard
let ctx_obj = ctx.with_selection_set(&ctx.node.selection_set); let ctx_obj = ctx.with_selection_set(&ctx.item.node.selection_set);
let res = #resolve_obj; let res = #resolve_obj;
#post_guard #post_guard
return #crate_name::OutputValueType::resolve(&res, &ctx_obj, ctx.item).await; return #crate_name::OutputValueType::resolve(&res, &ctx_obj, ctx.item).await;
@ -496,23 +496,23 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
async fn resolve_field(&self, ctx: &#crate_name::Context<'_>) -> #crate_name::Result<#crate_name::serde_json::Value> { async fn resolve_field(&self, ctx: &#crate_name::Context<'_>) -> #crate_name::Result<#crate_name::serde_json::Value> {
#(#resolvers)* #(#resolvers)*
Err(#crate_name::QueryError::FieldNotFound { Err(#crate_name::QueryError::FieldNotFound {
field_name: ctx.node.name.to_string(), field_name: ctx.item.node.name.to_string(),
object: #gql_typename.to_string(), object: #gql_typename.to_string(),
}.into_error(ctx.position())) }.into_error(ctx.item.pos))
} }
async fn find_entity(&self, ctx: &#crate_name::Context<'_>, params: &#crate_name::Value) -> #crate_name::Result<#crate_name::serde_json::Value> { async fn find_entity(&self, ctx: &#crate_name::Context<'_>, params: &#crate_name::Value) -> #crate_name::Result<#crate_name::serde_json::Value> {
let params = match params { let params = match params {
#crate_name::Value::Object(params) => params, #crate_name::Value::Object(params) => params,
_ => return Err(#crate_name::QueryError::EntityNotFound.into_error(ctx.position())), _ => return Err(#crate_name::QueryError::EntityNotFound.into_error(ctx.item.pos)),
}; };
let typename = if let Some(#crate_name::Value::String(typename)) = params.get("__typename") { let typename = if let Some(#crate_name::Value::String(typename)) = params.get("__typename") {
typename typename
} else { } else {
return Err(#crate_name::QueryError::TypeNameNotExists.into_error(ctx.position())); return Err(#crate_name::QueryError::TypeNameNotExists.into_error(ctx.item.pos));
}; };
#(#find_entities_iter)* #(#find_entities_iter)*
Err(#crate_name::QueryError::EntityNotFound.into_error(ctx.position())) Err(#crate_name::QueryError::EntityNotFound.into_error(ctx.item.pos))
} }
} }

View File

@ -98,10 +98,10 @@ pub fn generate(object_args: &args::Object, input: &DeriveInput) -> Result<Token
let ident = &item.ident; let ident = &item.ident;
let guard = field let guard = field
.guard .guard
.map(|guard| quote! { #guard.check(ctx).await.map_err(|err| err.into_error_with_path(ctx.position(), ctx.path_node.as_ref()))?; }); .map(|guard| quote! { #guard.check(ctx).await.map_err(|err| err.into_error_with_path(ctx.item.pos, ctx.path_node.as_ref()))?; });
let post_guard = field let post_guard = field
.post_guard .post_guard
.map(|guard| quote! { #guard.check(ctx, &res).await.map_err(|err| err.into_error_with_path(ctx.position(), ctx.path_node.as_ref()))?; }); .map(|guard| quote! { #guard.check(ctx, &res).await.map_err(|err| err.into_error_with_path(ctx.item.pos, ctx.path_node.as_ref()))?; });
let features = &field.features; let features = &field.features;
getters.push(if !field.owned { getters.push(if !field.owned {
@ -135,10 +135,10 @@ pub fn generate(object_args: &args::Object, input: &DeriveInput) -> Result<Token
}); });
resolvers.push(quote! { resolvers.push(quote! {
if ctx.node.name.node == #field_name { if ctx.item.node.name.node == #field_name {
#guard #guard
let res = self.#ident(ctx).await.map_err(|err| err.into_error_with_path(ctx.position(), ctx.path_node.as_ref()))?; let res = self.#ident(ctx).await.map_err(|err| err.into_error_with_path(ctx.item.pos, ctx.path_node.as_ref()))?;
let ctx_obj = ctx.with_selection_set(&ctx.node.selection_set); let ctx_obj = ctx.with_selection_set(&ctx.item.node.selection_set);
#post_guard #post_guard
return #crate_name::OutputValueType::resolve(&res, &ctx_obj, ctx.item).await; return #crate_name::OutputValueType::resolve(&res, &ctx_obj, ctx.item).await;
} }
@ -192,9 +192,9 @@ pub fn generate(object_args: &args::Object, input: &DeriveInput) -> Result<Token
async fn resolve_field(&self, ctx: &#crate_name::Context<'_>) -> #crate_name::Result<#crate_name::serde_json::Value> { async fn resolve_field(&self, ctx: &#crate_name::Context<'_>) -> #crate_name::Result<#crate_name::serde_json::Value> {
#(#resolvers)* #(#resolvers)*
Err(#crate_name::QueryError::FieldNotFound { Err(#crate_name::QueryError::FieldNotFound {
field_name: ctx.node.name.to_string(), field_name: ctx.item.node.name.to_string(),
object: #gql_typename.to_string(), object: #gql_typename.to_string(),
}.into_error(ctx.position())) }.into_error(ctx.item.pos))
} }
} }

View File

@ -234,11 +234,11 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
let create_field_stream = quote! { let create_field_stream = quote! {
#crate_name::futures::stream::StreamExt::fuse(self.#ident(ctx, #(#use_params),*).await. #crate_name::futures::stream::StreamExt::fuse(self.#ident(ctx, #(#use_params),*).await.
map_err(|err| err.into_error_with_path(ctx.position(), ctx.path_node.as_ref()))?) map_err(|err| err.into_error_with_path(ctx.item.pos, ctx.path_node.as_ref()))?)
}; };
let guard = field.guard.map(|guard| quote! { let guard = field.guard.map(|guard| quote! {
#guard.check(ctx).await.map_err(|err| err.into_error_with_path(ctx.position(), ctx.path_node.as_ref()))?; #guard.check(ctx).await.map_err(|err| err.into_error_with_path(ctx.item.pos, ctx.path_node.as_ref()))?;
}); });
if field.post_guard.is_some() { if field.post_guard.is_some() {
return Err(Error::new_spanned( return Err(Error::new_spanned(
@ -248,13 +248,13 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
} }
create_stream.push(quote! { create_stream.push(quote! {
if ctx.node.name.node == #field_name { if ctx.item.node.name.node == #field_name {
#(#get_params)* #(#get_params)*
#guard #guard
let field_name = ::std::sync::Arc::new(ctx.item.node.response_key().node.clone()); let field_name = ::std::sync::Arc::new(ctx.item.node.response_key().node.clone());
let field = ::std::sync::Arc::new(ctx.item.clone()); let field = ::std::sync::Arc::new(ctx.item.clone());
let pos = ctx.position(); let pos = ctx.item.pos;
let schema_env = schema_env.clone(); let schema_env = schema_env.clone();
let query_env = query_env.clone(); let query_env = query_env.clone();
let stream = #crate_name::futures::StreamExt::then(#create_field_stream, { let stream = #crate_name::futures::StreamExt::then(#create_field_stream, {
@ -353,9 +353,9 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
) -> #crate_name::Result<::std::pin::Pin<Box<dyn #crate_name::futures::Stream<Item = #crate_name::Response> + Send>>> { ) -> #crate_name::Result<::std::pin::Pin<Box<dyn #crate_name::futures::Stream<Item = #crate_name::Response> + Send>>> {
#(#create_stream)* #(#create_stream)*
Err(#crate_name::QueryError::FieldNotFound { Err(#crate_name::QueryError::FieldNotFound {
field_name: ctx.node.name.to_string(), field_name: ctx.item.node.name.to_string(),
object: #gql_typename.to_string(), object: #gql_typename.to_string(),
}.into_error(ctx.position())) }.into_error(ctx.item.pos))
} }
} }
}; };

View File

@ -130,9 +130,9 @@ pub fn generate(union_args: &args::Interface, input: &DeriveInput) -> Result<Tok
impl #generics #crate_name::resolver_utils::ObjectType for #ident #generics { impl #generics #crate_name::resolver_utils::ObjectType for #ident #generics {
async fn resolve_field(&self, ctx: &#crate_name::Context<'_>) -> #crate_name::Result<#crate_name::serde_json::Value> { async fn resolve_field(&self, ctx: &#crate_name::Context<'_>) -> #crate_name::Result<#crate_name::serde_json::Value> {
Err(#crate_name::QueryError::FieldNotFound { Err(#crate_name::QueryError::FieldNotFound {
field_name: ctx.node.name.to_string(), field_name: ctx.item.node.name.to_string(),
object: #gql_typename.to_string(), object: #gql_typename.to_string(),
}.into_error(ctx.position())) }.into_error(ctx.item.pos))
} }
fn collect_all_fields<'a>(&'a self, ctx: &#crate_name::ContextSelectionSet<'a>, fields: &mut #crate_name::resolver_utils::Fields<'a>) -> #crate_name::Result<()> { fn collect_all_fields<'a>(&'a self, ctx: &#crate_name::ContextSelectionSet<'a>, fields: &mut #crate_name::resolver_utils::Fields<'a>) -> #crate_name::Result<()> {

View File

@ -236,14 +236,6 @@ pub struct ContextBase<'a, T> {
pub(crate) query_env: &'a QueryEnv, pub(crate) query_env: &'a QueryEnv,
} }
impl<'a, T> Deref for ContextBase<'a, T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.item
}
}
#[doc(hidden)] #[doc(hidden)]
pub struct QueryEnvInner { pub struct QueryEnvInner {
pub extensions: spin::Mutex<Extensions>, pub extensions: spin::Mutex<Extensions>,
@ -488,11 +480,6 @@ impl<'a> ContextBase<'a, &'a Positioned<Field>> {
InputValueType::parse(value).map_err(|e| e.into_error(pos, T::qualified_type_name())) InputValueType::parse(value).map_err(|e| e.into_error(pos, T::qualified_type_name()))
} }
/// Get the position of the current field in the query code.
pub fn position(&self) -> Pos {
self.pos
}
/// Creates a uniform interface to inspect the forthcoming selections. /// Creates a uniform interface to inspect the forthcoming selections.
/// ///
/// # Examples /// # Examples

View File

@ -38,7 +38,7 @@ pub trait ObjectType: OutputValueType {
/// Query entities with params /// Query entities with params
async fn find_entity(&self, ctx: &Context<'_>, _params: &Value) -> Result<serde_json::Value> { async fn find_entity(&self, ctx: &Context<'_>, _params: &Value) -> Result<serde_json::Value> {
Err(QueryError::EntityNotFound.into_error(ctx.pos)) Err(QueryError::EntityNotFound.into_error(ctx.item.pos))
} }
} }

View File

@ -196,17 +196,17 @@ where
EE: ObjectType + Sync + Send, EE: ObjectType + Sync + Send,
{ {
async fn resolve_field(&self, ctx: &Context<'_>) -> Result<serde_json::Value> { async fn resolve_field(&self, ctx: &Context<'_>) -> Result<serde_json::Value> {
if ctx.node.name.node == "pageInfo" { if ctx.item.node.name.node == "pageInfo" {
let page_info = PageInfo { let page_info = PageInfo {
has_previous_page: self.has_previous_page, has_previous_page: self.has_previous_page,
has_next_page: self.has_next_page, has_next_page: self.has_next_page,
start_cursor: self.edges.first().map(|edge| edge.cursor.encode_cursor()), start_cursor: self.edges.first().map(|edge| edge.cursor.encode_cursor()),
end_cursor: self.edges.last().map(|edge| edge.cursor.encode_cursor()), end_cursor: self.edges.last().map(|edge| edge.cursor.encode_cursor()),
}; };
let ctx_obj = ctx.with_selection_set(&ctx.node.selection_set); let ctx_obj = ctx.with_selection_set(&ctx.item.node.selection_set);
return OutputValueType::resolve(&page_info, &ctx_obj, ctx.item).await; return OutputValueType::resolve(&page_info, &ctx_obj, ctx.item).await;
} else if ctx.node.name.node == "edges" { } else if ctx.item.node.name.node == "edges" {
let ctx_obj = ctx.with_selection_set(&ctx.node.selection_set); let ctx_obj = ctx.with_selection_set(&ctx.item.node.selection_set);
return OutputValueType::resolve(&self.edges, &ctx_obj, ctx.item).await; return OutputValueType::resolve(&self.edges, &ctx_obj, ctx.item).await;
} }

View File

@ -111,10 +111,10 @@ where
E: ObjectType + Sync + Send, E: ObjectType + Sync + Send,
{ {
async fn resolve_field(&self, ctx: &Context<'_>) -> Result<serde_json::Value> { async fn resolve_field(&self, ctx: &Context<'_>) -> Result<serde_json::Value> {
if ctx.node.name.node == "node" { if ctx.item.node.name.node == "node" {
let ctx_obj = ctx.with_selection_set(&ctx.node.selection_set); let ctx_obj = ctx.with_selection_set(&ctx.item.node.selection_set);
return OutputValueType::resolve(&self.node, &ctx_obj, ctx.item).await; return OutputValueType::resolve(&self.node, &ctx_obj, ctx.item).await;
} else if ctx.node.name.node == "cursor" { } else if ctx.item.node.name.node == "cursor" {
return Ok(self.cursor.encode_cursor().into()); return Ok(self.cursor.encode_cursor().into());
} }

View File

@ -85,7 +85,7 @@ impl<T: ObjectType + Send + Sync> ObjectType for QueryRoot<T> {
if ctx.item.node.name.node == "__schema" { if ctx.item.node.name.node == "__schema" {
if self.disable_introspection { if self.disable_introspection {
return Err(Error::Query { return Err(Error::Query {
pos: ctx.pos, pos: ctx.item.pos,
path: ctx path: ctx
.path_node .path_node
.as_ref() .as_ref()