aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2023-05-04 07:59:50 +0000
committerFuwn <[email protected]>2023-05-04 07:59:50 +0000
commit870ae2237e494a275f8552707084559b6abff376 (patch)
treef9676cfad7e2346355dde3917f8d6a9a7870cd25
parentdeps(rossweisse): pin to 0.0.0 (diff)
downloadwindmark-870ae2237e494a275f8552707084559b6abff376.tar.xz
windmark-870ae2237e494a275f8552707084559b6abff376.zip
feat(methods): special index handling
-rw-r--r--examples/struct_router.rs2
-rw-r--r--rossweisse/src/implementations/router/fields.rs5
-rw-r--r--rossweisse/src/implementations/router/methods.rs45
-rw-r--r--rossweisse/src/implementations/router/parser/field_initializer.rs8
-rw-r--r--rossweisse/src/implementations/router/parser/field_initializers.rs8
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()))
}
}