diff options
| author | Fuwn <[email protected]> | 2023-05-04 07:59:50 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-05-04 07:59:50 +0000 |
| commit | 870ae2237e494a275f8552707084559b6abff376 (patch) | |
| tree | f9676cfad7e2346355dde3917f8d6a9a7870cd25 | |
| parent | deps(rossweisse): pin to 0.0.0 (diff) | |
| download | windmark-870ae2237e494a275f8552707084559b6abff376.tar.xz windmark-870ae2237e494a275f8552707084559b6abff376.zip | |
feat(methods): special index handling
5 files changed, 46 insertions, 22 deletions
diff --git a/examples/struct_router.rs b/examples/struct_router.rs index bf559ab..a636f7d 100644 --- a/examples/struct_router.rs +++ b/examples/struct_router.rs @@ -26,7 +26,7 @@ struct Router { #[rossweisse::router] impl Router { - #[route] + #[route(index)] pub fn index( _context: windmark::context::RouteContext, ) -> windmark::Response { diff --git a/rossweisse/src/implementations/router/fields.rs b/rossweisse/src/implementations/router/fields.rs index e1a92b9..697e0c1 100644 --- a/rossweisse/src/implementations/router/fields.rs +++ b/rossweisse/src/implementations/router/fields.rs @@ -20,8 +20,9 @@ use quote::quote; use syn::parse_macro_input; pub fn fields(arguments: TokenStream, item: syn::ItemStruct) -> TokenStream { - let field_initializers = - parse_macro_input!(arguments as super::parser::FieldInitializers); + let field_initializers = parse_macro_input!( + arguments as super::parser::FieldInitializers<syn::Expr> + ); let router_identifier = item.ident; let named_fields = match item.fields { syn::Fields::Named(fields) => fields, diff --git a/rossweisse/src/implementations/router/methods.rs b/rossweisse/src/implementations/router/methods.rs index 4f9bbdf..2ae4086 100644 --- a/rossweisse/src/implementations/router/methods.rs +++ b/rossweisse/src/implementations/router/methods.rs @@ -17,21 +17,35 @@ use proc_macro::TokenStream; -pub fn methods(_arguments: TokenStream, item: syn::ItemImpl) -> TokenStream { +pub fn methods( + _arguments: TokenStream, + mut item: syn::ItemImpl, +) -> TokenStream { let routes = item .items - .iter() + .iter_mut() .filter_map(|item| { if let syn::ImplItem::Fn(method) = item { - if method - .attrs - .iter() - .any(|attribute| attribute.path().is_ident("route")) - { - Some(method.sig.ident.clone()) - } else { - None + for attribute in method.attrs.iter() { + if attribute.path().is_ident("route") { + let arguments = quote::ToTokens::into_token_stream(attribute) + .to_string() + .trim_end_matches(")]") + .trim_start_matches("#[route(") + .to_string(); + + if arguments == "index" { + method.sig.ident = + syn::Ident::new("__router_index", method.sig.ident.span()); + } + + return Some(method.sig.ident.clone()); + } else { + return None; + } } + + None } else { None } @@ -42,7 +56,16 @@ pub fn methods(_arguments: TokenStream, item: syn::ItemImpl) -> TokenStream { let name = &item.self_ty; let route_paths = routes .iter() - .map(|route| format!("/{}", route)) + .map(|route| { + format!( + "/{}", + if route == "__router_index" { + "".to_string() + } else { + route.to_string() + } + ) + }) .collect::<Vec<_>>(); quote::quote! { diff --git a/rossweisse/src/implementations/router/parser/field_initializer.rs b/rossweisse/src/implementations/router/parser/field_initializer.rs index 212f88a..ce0ff9d 100644 --- a/rossweisse/src/implementations/router/parser/field_initializer.rs +++ b/rossweisse/src/implementations/router/parser/field_initializer.rs @@ -15,16 +15,16 @@ // Copyright (C) 2022-2023 Fuwn <[email protected]> // SPDX-License-Identifier: GPL-3.0-only -use syn::parse; +use syn::parse::{self, Parse}; -pub struct FieldInitializer { +pub struct FieldInitializer<T: Parse> { pub ident: syn::Ident, #[allow(unused)] eq_token: syn::Token![=], - pub expr: syn::Expr, + pub expr: T, } -impl parse::Parse for FieldInitializer { +impl<T: Parse> parse::Parse for FieldInitializer<T> { fn parse(input: parse::ParseStream<'_>) -> syn::Result<Self> { let ident = input.parse()?; let eq_token = input.parse()?; diff --git a/rossweisse/src/implementations/router/parser/field_initializers.rs b/rossweisse/src/implementations/router/parser/field_initializers.rs index 649b0d7..e0eb4b9 100644 --- a/rossweisse/src/implementations/router/parser/field_initializers.rs +++ b/rossweisse/src/implementations/router/parser/field_initializers.rs @@ -15,14 +15,14 @@ // Copyright (C) 2022-2023 Fuwn <[email protected]> // SPDX-License-Identifier: GPL-3.0-only -use syn::parse; +use syn::parse::{self, Parse}; use super::field_initializer::FieldInitializer; -pub struct FieldInitializers(pub Vec<FieldInitializer>); +pub struct FieldInitializers<T: Parse>(pub Vec<FieldInitializer<T>>); -impl parse::Parse for FieldInitializers { +impl<T: Parse> parse::Parse for FieldInitializers<T> { fn parse(input: parse::ParseStream<'_>) -> syn::Result<Self> { - Ok(Self(syn::punctuated::Punctuated::<FieldInitializer, syn::Token![,]>::parse_terminated(input)?.into_iter().collect())) + Ok(Self(syn::punctuated::Punctuated::<FieldInitializer<T>, syn::Token![,]>::parse_terminated(input)?.into_iter().collect())) } } |