mirror of
https://gitlab.com/msrd0/gotham-restful.git
synced 2025-02-23 04:52:28 +00:00
get rid of mod's in error messages
This commit is contained in:
parent
f9c2009023
commit
4fd5464e44
8 changed files with 91 additions and 127 deletions
|
@ -4,7 +4,7 @@ use proc_macro2::{Ident, Span, TokenStream};
|
||||||
use quote::{format_ident, quote};
|
use quote::{format_ident, quote};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use syn::{
|
use syn::{
|
||||||
spanned::Spanned, Attribute, AttributeArgs, Error, FnArg, ItemFn, Lit, LitBool, Meta, NestedMeta, PatType, Result,
|
spanned::Spanned, Attribute, AttributeArgs, Error, FnArg, ItemFn, Lit, LitBool, Meta, NestedMeta, PatType, Path, Result,
|
||||||
ReturnType, Type
|
ReturnType, Type
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -82,20 +82,12 @@ impl Method {
|
||||||
format_ident!("{}", name)
|
format_ident!("{}", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn mod_ident(&self, resource: &str) -> Ident {
|
|
||||||
format_ident!(
|
|
||||||
"_gotham_restful_resource_{}_method_{}",
|
|
||||||
resource.to_snake_case(),
|
|
||||||
self.fn_ident()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn handler_struct_ident(&self, resource: &str) -> Ident {
|
pub fn handler_struct_ident(&self, resource: &str) -> Ident {
|
||||||
format_ident!("{}{}Handler", resource.to_camel_case(), self.trait_ident())
|
format_ident!("{}{}Handler", resource.to_camel_case(), self.trait_ident())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn setup_ident(&self, resource: &str) -> Ident {
|
pub fn setup_ident(&self, resource: &str) -> Ident {
|
||||||
format_ident!("{}_{}_setup_impl", resource.to_snake_case(), self.fn_ident())
|
format_ident!("_gotham_restful_{}_{}_setup_impl", resource.to_snake_case(), self.fn_ident())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,33 +241,16 @@ fn expand_wants_auth(attrs: &[NestedMeta], default: bool) -> TokenStream {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(clippy::comparison_chain)]
|
#[allow(clippy::comparison_chain)]
|
||||||
pub fn expand_method(method: Method, mut attrs: AttributeArgs, fun: ItemFn) -> Result<TokenStream> {
|
fn setup_body(
|
||||||
|
method: &Method,
|
||||||
|
fun: &ItemFn,
|
||||||
|
attrs: &[NestedMeta],
|
||||||
|
resource_name: &str,
|
||||||
|
resource_path: &Path
|
||||||
|
) -> Result<TokenStream> {
|
||||||
let krate = super::krate();
|
let krate = super::krate();
|
||||||
|
|
||||||
// parse attributes
|
|
||||||
if attrs.len() < 1 {
|
|
||||||
return Err(Error::new(
|
|
||||||
Span::call_site(),
|
|
||||||
"Missing Resource struct. Example: #[read_all(MyResource)]"
|
|
||||||
));
|
|
||||||
}
|
|
||||||
let resource_path = match attrs.remove(0) {
|
|
||||||
NestedMeta::Meta(Meta::Path(path)) => path,
|
|
||||||
p => {
|
|
||||||
return Err(Error::new(
|
|
||||||
p.span(),
|
|
||||||
"Expected name of the Resource struct this method belongs to"
|
|
||||||
))
|
|
||||||
},
|
|
||||||
};
|
|
||||||
let resource_name = resource_path
|
|
||||||
.segments
|
|
||||||
.last()
|
|
||||||
.map(|s| s.ident.to_string())
|
|
||||||
.ok_or_else(|| Error::new(resource_path.span(), "Resource name must not be empty"))?;
|
|
||||||
|
|
||||||
let fun_ident = &fun.sig.ident;
|
let fun_ident = &fun.sig.ident;
|
||||||
let fun_vis = &fun.vis;
|
|
||||||
let fun_is_async = fun.sig.asyncness.is_some();
|
let fun_is_async = fun.sig.asyncness.is_some();
|
||||||
|
|
||||||
if let Some(unsafety) = fun.sig.unsafety {
|
if let Some(unsafety) = fun.sig.unsafety {
|
||||||
|
@ -284,9 +259,7 @@ pub fn expand_method(method: Method, mut attrs: AttributeArgs, fun: ItemFn) -> R
|
||||||
|
|
||||||
let trait_ident = method.trait_ident();
|
let trait_ident = method.trait_ident();
|
||||||
let method_ident = method.fn_ident();
|
let method_ident = method.fn_ident();
|
||||||
let mod_ident = method.mod_ident(&resource_name);
|
let handler_ident = method.handler_struct_ident(resource_name);
|
||||||
let handler_ident = method.handler_struct_ident(&resource_name);
|
|
||||||
let setup_ident = method.setup_ident(&resource_name);
|
|
||||||
|
|
||||||
let (ret, is_no_content) = match &fun.sig.output {
|
let (ret, is_no_content) = match &fun.sig.output {
|
||||||
ReturnType::Default => (quote!(#krate::NoContent), true),
|
ReturnType::Default => (quote!(#krate::NoContent), true),
|
||||||
|
@ -410,52 +383,84 @@ pub fn expand_method(method: Method, mut attrs: AttributeArgs, fun: ItemFn) -> R
|
||||||
}
|
}
|
||||||
|
|
||||||
// attribute generated code
|
// attribute generated code
|
||||||
let operation_id = expand_operation_id(&attrs);
|
let operation_id = expand_operation_id(attrs);
|
||||||
let wants_auth = expand_wants_auth(&attrs, args.iter().any(|arg| (*arg).ty.is_auth_status()));
|
let wants_auth = expand_wants_auth(attrs, args.iter().any(|arg| (*arg).ty.is_auth_status()));
|
||||||
|
|
||||||
// put everything together
|
// put everything together
|
||||||
|
let mut dummy = format_ident!("_IMPL_RESOURCEMETHOD_FOR_{}", fun_ident);
|
||||||
|
dummy.set_span(Span::call_site());
|
||||||
|
Ok(quote! {
|
||||||
|
struct #handler_ident;
|
||||||
|
|
||||||
|
impl #krate::ResourceMethod for #handler_ident {
|
||||||
|
type Res = #ret;
|
||||||
|
|
||||||
|
#operation_id
|
||||||
|
#wants_auth
|
||||||
|
}
|
||||||
|
|
||||||
|
impl #krate::#trait_ident for #handler_ident
|
||||||
|
where #where_clause
|
||||||
|
{
|
||||||
|
#(#generics)*
|
||||||
|
|
||||||
|
fn #method_ident(#(#args_def),*) -> std::pin::Pin<Box<dyn std::future::Future<Output = (#krate::State, #ret)> + Send>> {
|
||||||
|
#[allow(unused_imports)]
|
||||||
|
use #krate::{export::FutureExt, FromState};
|
||||||
|
|
||||||
|
#state_block
|
||||||
|
|
||||||
|
async move {
|
||||||
|
let #res_ident = { #block };
|
||||||
|
(#state_ident, #res_ident)
|
||||||
|
}.boxed()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
route.#method_ident::<#handler_ident>();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn expand_method(method: Method, mut attrs: AttributeArgs, fun: ItemFn) -> Result<TokenStream> {
|
||||||
|
let krate = super::krate();
|
||||||
|
|
||||||
|
// parse attributes
|
||||||
|
if attrs.len() < 1 {
|
||||||
|
return Err(Error::new(
|
||||||
|
Span::call_site(),
|
||||||
|
"Missing Resource struct. Example: #[read_all(MyResource)]"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
let resource_path = match attrs.remove(0) {
|
||||||
|
NestedMeta::Meta(Meta::Path(path)) => path,
|
||||||
|
p => {
|
||||||
|
return Err(Error::new(
|
||||||
|
p.span(),
|
||||||
|
"Expected name of the Resource struct this method belongs to"
|
||||||
|
))
|
||||||
|
},
|
||||||
|
};
|
||||||
|
let resource_name = resource_path
|
||||||
|
.segments
|
||||||
|
.last()
|
||||||
|
.map(|s| s.ident.to_string())
|
||||||
|
.ok_or_else(|| Error::new(resource_path.span(), "Resource name must not be empty"))?;
|
||||||
|
|
||||||
|
let fun_vis = &fun.vis;
|
||||||
|
let setup_ident = method.setup_ident(&resource_name);
|
||||||
|
let setup_body = match setup_body(&method, &fun, &attrs, &resource_name, &resource_path) {
|
||||||
|
Ok(body) => body,
|
||||||
|
Err(err) => err.to_compile_error()
|
||||||
|
};
|
||||||
|
|
||||||
Ok(quote! {
|
Ok(quote! {
|
||||||
#fun
|
#fun
|
||||||
|
|
||||||
#fun_vis mod #mod_ident
|
#[deny(dead_code)]
|
||||||
{
|
#[doc(hidden)]
|
||||||
use super::*;
|
/// `gotham_restful` implementation detail.
|
||||||
|
#fun_vis fn #setup_ident<D : #krate::DrawResourceRoutes>(route : &mut D) {
|
||||||
struct #handler_ident;
|
#setup_body
|
||||||
|
|
||||||
impl #krate::ResourceMethod for #handler_ident
|
|
||||||
{
|
|
||||||
type Res = #ret;
|
|
||||||
|
|
||||||
#operation_id
|
|
||||||
#wants_auth
|
|
||||||
}
|
|
||||||
|
|
||||||
impl #krate::#trait_ident for #handler_ident
|
|
||||||
where #where_clause
|
|
||||||
{
|
|
||||||
#(#generics)*
|
|
||||||
|
|
||||||
fn #method_ident(#(#args_def),*) -> std::pin::Pin<Box<dyn std::future::Future<Output = (#krate::State, #ret)> + Send>>
|
|
||||||
{
|
|
||||||
#[allow(unused_imports)]
|
|
||||||
use #krate::{export::FutureExt, FromState};
|
|
||||||
|
|
||||||
#state_block
|
|
||||||
|
|
||||||
async move {
|
|
||||||
let #res_ident = { #block };
|
|
||||||
(#state_ident, #res_ident)
|
|
||||||
}.boxed()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[deny(dead_code)]
|
|
||||||
pub fn #setup_ident<D : #krate::DrawResourceRoutes>(route : &mut D)
|
|
||||||
{
|
|
||||||
route.#method_ident::<#handler_ident>();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,9 +38,8 @@ pub fn expand_resource(input: DeriveInput) -> Result<TokenStream> {
|
||||||
.flat_map(|list| match list {
|
.flat_map(|list| match list {
|
||||||
Ok(iter) => Box::new(iter.map(|method| {
|
Ok(iter) => Box::new(iter.map(|method| {
|
||||||
let method = Method::from_str(&method.to_string()).map_err(|err| Error::new(method.span(), err))?;
|
let method = Method::from_str(&method.to_string()).map_err(|err| Error::new(method.span(), err))?;
|
||||||
let mod_ident = method.mod_ident(&name);
|
|
||||||
let ident = method.setup_ident(&name);
|
let ident = method.setup_ident(&name);
|
||||||
Ok(quote!(#mod_ident::#ident(&mut route);))
|
Ok(quote!(#ident(&mut route);))
|
||||||
})) as Box<dyn Iterator<Item = Result<TokenStream>>>,
|
})) as Box<dyn Iterator<Item = Result<TokenStream>>>,
|
||||||
Err(err) => Box::new(iter::once(Err(err)))
|
Err(err) => Box::new(iter::once(Err(err)))
|
||||||
})
|
})
|
||||||
|
|
|
@ -3,19 +3,3 @@ error: async fn must not take &State as an argument as State is not Sync, consid
|
||||||
|
|
|
|
||||||
9 | async fn read_all(state : &State)
|
9 | async fn read_all(state : &State)
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read_all`
|
|
||||||
--> $DIR/method_async_state.rs:4:10
|
|
||||||
|
|
|
||||||
4 | #[derive(Resource)]
|
|
||||||
| ^^^^^^^^ use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read_all`
|
|
||||||
|
|
|
||||||
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
||||||
|
|
||||||
warning: unused import: `gotham_restful::State`
|
|
||||||
--> $DIR/method_async_state.rs:2:5
|
|
||||||
|
|
|
||||||
2 | use gotham_restful::State;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= note: `#[warn(unused_imports)]` on by default
|
|
||||||
|
|
|
@ -6,10 +6,10 @@ error: Missing Resource struct. Example: #[read_all(MyResource)]
|
||||||
|
|
|
|
||||||
= note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read_all`
|
error[E0425]: cannot find function `_gotham_restful_foo_resource_read_all_setup_impl` in this scope
|
||||||
--> $DIR/method_no_resource.rs:3:10
|
--> $DIR/method_no_resource.rs:3:10
|
||||||
|
|
|
|
||||||
3 | #[derive(Resource)]
|
3 | #[derive(Resource)]
|
||||||
| ^^^^^^^^ use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read_all`
|
| ^^^^^^^^ not found in this scope
|
||||||
|
|
|
|
||||||
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
|
@ -4,10 +4,10 @@ error: Didn't expect self parameter
|
||||||
8 | fn read_all(self)
|
8 | fn read_all(self)
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read_all`
|
error: `self` parameter is only allowed in associated functions
|
||||||
--> $DIR/method_self.rs:3:10
|
--> $DIR/method_self.rs:8:13
|
||||||
|
|
|
|
||||||
3 | #[derive(Resource)]
|
8 | fn read_all(self)
|
||||||
| ^^^^^^^^ use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read_all`
|
| ^^^^ not semantically valid as function parameter
|
||||||
|
|
|
|
||||||
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: associated functions are those in `impl` or `trait` definitions
|
||||||
|
|
|
@ -3,11 +3,3 @@ error: Too few arguments
|
||||||
|
|
|
|
||||||
8 | fn read()
|
8 | fn read()
|
||||||
| ^^^^
|
| ^^^^
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read`
|
|
||||||
--> $DIR/method_too_few_args.rs:3:10
|
|
||||||
|
|
|
||||||
3 | #[derive(Resource)]
|
|
||||||
| ^^^^^^^^ use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read`
|
|
||||||
|
|
|
||||||
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
||||||
|
|
|
@ -3,11 +3,3 @@ error: Too many arguments
|
||||||
|
|
|
|
||||||
8 | fn read_all(_id : u64)
|
8 | fn read_all(_id : u64)
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read_all`
|
|
||||||
--> $DIR/method_too_many_args.rs:3:10
|
|
||||||
|
|
|
||||||
3 | #[derive(Resource)]
|
|
||||||
| ^^^^^^^^ use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read_all`
|
|
||||||
|
|
|
||||||
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
||||||
|
|
|
@ -3,11 +3,3 @@ error: Resource methods must not be unsafe
|
||||||
|
|
|
|
||||||
8 | unsafe fn read_all()
|
8 | unsafe fn read_all()
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
|
||||||
error[E0433]: failed to resolve: use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read_all`
|
|
||||||
--> $DIR/method_unsafe.rs:3:10
|
|
||||||
|
|
|
||||||
3 | #[derive(Resource)]
|
|
||||||
| ^^^^^^^^ use of undeclared crate or module `_gotham_restful_resource_foo_resource_method_read_all`
|
|
||||||
|
|
|
||||||
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue