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! {
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! {
if ctx.node.name.node == #name {
if ctx.item.node.name.node == #name {
#(#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;
}
});
@ -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> {
#(#resolvers)*
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(),
}.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<()> {

View File

@ -151,7 +151,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
// requires
requires_getter.push(quote! {
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);
}
@ -177,7 +177,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
)
.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((
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 let (#(#key_pat),*) = (#(#key_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;
}
}
@ -400,7 +400,7 @@ pub fn generate(object_args: &args::Object, item_impl: &mut ItemImpl) -> Result<
let resolve_obj = quote! {
{
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
.map(|guard| quote! {
#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
.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_err(|err| err.into_error_with_path(ctx.item.pos, ctx.path_node.as_ref()))?;
});
resolvers.push(quote! {
if ctx.node.name.node == #field_name {
if ctx.item.node.name.node == #field_name {
#(#get_params)*
#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;
#post_guard
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> {
#(#resolvers)*
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(),
}.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> {
let params = match 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") {
typename
} 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)*
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 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()))?; });
.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
.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;
getters.push(if !field.owned {
@ -135,10 +135,10 @@ pub fn generate(object_args: &args::Object, input: &DeriveInput) -> Result<Token
});
resolvers.push(quote! {
if ctx.node.name.node == #field_name {
if ctx.item.node.name.node == #field_name {
#guard
let res = self.#ident(ctx).await.map_err(|err| err.into_error_with_path(ctx.position(), ctx.path_node.as_ref()))?;
let ctx_obj = ctx.with_selection_set(&ctx.node.selection_set);
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.item.node.selection_set);
#post_guard
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> {
#(#resolvers)*
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(),
}.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! {
#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! {
#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() {
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! {
if ctx.node.name.node == #field_name {
if ctx.item.node.name.node == #field_name {
#(#get_params)*
#guard
let field_name = ::std::sync::Arc::new(ctx.item.node.response_key().node.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 query_env = query_env.clone();
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>>> {
#(#create_stream)*
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(),
}.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 {
async fn resolve_field(&self, ctx: &#crate_name::Context<'_>) -> #crate_name::Result<#crate_name::serde_json::Value> {
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(),
}.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<()> {

View File

@ -236,14 +236,6 @@ pub struct ContextBase<'a, T> {
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)]
pub struct QueryEnvInner {
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()))
}
/// 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.
///
/// # Examples

View File

@ -38,7 +38,7 @@ pub trait ObjectType: OutputValueType {
/// Query entities with params
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,
{
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 {
has_previous_page: self.has_previous_page,
has_next_page: self.has_next_page,
start_cursor: self.edges.first().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;
} else if ctx.node.name.node == "edges" {
let ctx_obj = ctx.with_selection_set(&ctx.node.selection_set);
} else if ctx.item.node.name.node == "edges" {
let ctx_obj = ctx.with_selection_set(&ctx.item.node.selection_set);
return OutputValueType::resolve(&self.edges, &ctx_obj, ctx.item).await;
}

View File

@ -111,10 +111,10 @@ where
E: ObjectType + Sync + Send,
{
async fn resolve_field(&self, ctx: &Context<'_>) -> Result<serde_json::Value> {
if ctx.node.name.node == "node" {
let ctx_obj = ctx.with_selection_set(&ctx.node.selection_set);
if ctx.item.node.name.node == "node" {
let ctx_obj = ctx.with_selection_set(&ctx.item.node.selection_set);
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());
}

View File

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