🏗️ Elegant & Highly Performant Async Gemini Server Framework for the Modern Age
async framework gemini-protocol protocol gemini rust
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(methods): special index handling

Fuwn 870ae223 dce7e402

+46 -22
+1 -1
examples/struct_router.rs
··· 26 26 27 27 #[rossweisse::router] 28 28 impl Router { 29 - #[route] 29 + #[route(index)] 30 30 pub fn index( 31 31 _context: windmark::context::RouteContext, 32 32 ) -> windmark::Response {
+3 -2
rossweisse/src/implementations/router/fields.rs
··· 20 20 use syn::parse_macro_input; 21 21 22 22 pub fn fields(arguments: TokenStream, item: syn::ItemStruct) -> TokenStream { 23 - let field_initializers = 24 - parse_macro_input!(arguments as super::parser::FieldInitializers); 23 + let field_initializers = parse_macro_input!( 24 + arguments as super::parser::FieldInitializers<syn::Expr> 25 + ); 25 26 let router_identifier = item.ident; 26 27 let named_fields = match item.fields { 27 28 syn::Fields::Named(fields) => fields,
+34 -11
rossweisse/src/implementations/router/methods.rs
··· 17 17 18 18 use proc_macro::TokenStream; 19 19 20 - pub fn methods(_arguments: TokenStream, item: syn::ItemImpl) -> TokenStream { 20 + pub fn methods( 21 + _arguments: TokenStream, 22 + mut item: syn::ItemImpl, 23 + ) -> TokenStream { 21 24 let routes = item 22 25 .items 23 - .iter() 26 + .iter_mut() 24 27 .filter_map(|item| { 25 28 if let syn::ImplItem::Fn(method) = item { 26 - if method 27 - .attrs 28 - .iter() 29 - .any(|attribute| attribute.path().is_ident("route")) 30 - { 31 - Some(method.sig.ident.clone()) 32 - } else { 33 - None 29 + for attribute in method.attrs.iter() { 30 + if attribute.path().is_ident("route") { 31 + let arguments = quote::ToTokens::into_token_stream(attribute) 32 + .to_string() 33 + .trim_end_matches(")]") 34 + .trim_start_matches("#[route(") 35 + .to_string(); 36 + 37 + if arguments == "index" { 38 + method.sig.ident = 39 + syn::Ident::new("__router_index", method.sig.ident.span()); 40 + } 41 + 42 + return Some(method.sig.ident.clone()); 43 + } else { 44 + return None; 45 + } 34 46 } 47 + 48 + None 35 49 } else { 36 50 None 37 51 } ··· 42 56 let name = &item.self_ty; 43 57 let route_paths = routes 44 58 .iter() 45 - .map(|route| format!("/{}", route)) 59 + .map(|route| { 60 + format!( 61 + "/{}", 62 + if route == "__router_index" { 63 + "".to_string() 64 + } else { 65 + route.to_string() 66 + } 67 + ) 68 + }) 46 69 .collect::<Vec<_>>(); 47 70 48 71 quote::quote! {
+4 -4
rossweisse/src/implementations/router/parser/field_initializer.rs
··· 15 15 // Copyright (C) 2022-2023 Fuwn <contact@fuwn.me> 16 16 // SPDX-License-Identifier: GPL-3.0-only 17 17 18 - use syn::parse; 18 + use syn::parse::{self, Parse}; 19 19 20 - pub struct FieldInitializer { 20 + pub struct FieldInitializer<T: Parse> { 21 21 pub ident: syn::Ident, 22 22 #[allow(unused)] 23 23 eq_token: syn::Token![=], 24 - pub expr: syn::Expr, 24 + pub expr: T, 25 25 } 26 26 27 - impl parse::Parse for FieldInitializer { 27 + impl<T: Parse> parse::Parse for FieldInitializer<T> { 28 28 fn parse(input: parse::ParseStream<'_>) -> syn::Result<Self> { 29 29 let ident = input.parse()?; 30 30 let eq_token = input.parse()?;
+4 -4
rossweisse/src/implementations/router/parser/field_initializers.rs
··· 15 15 // Copyright (C) 2022-2023 Fuwn <contact@fuwn.me> 16 16 // SPDX-License-Identifier: GPL-3.0-only 17 17 18 - use syn::parse; 18 + use syn::parse::{self, Parse}; 19 19 20 20 use super::field_initializer::FieldInitializer; 21 21 22 - pub struct FieldInitializers(pub Vec<FieldInitializer>); 22 + pub struct FieldInitializers<T: Parse>(pub Vec<FieldInitializer<T>>); 23 23 24 - impl parse::Parse for FieldInitializers { 24 + impl<T: Parse> parse::Parse for FieldInitializers<T> { 25 25 fn parse(input: parse::ParseStream<'_>) -> syn::Result<Self> { 26 - Ok(Self(syn::punctuated::Punctuated::<FieldInitializer, syn::Token![,]>::parse_terminated(input)?.into_iter().collect())) 26 + Ok(Self(syn::punctuated::Punctuated::<FieldInitializer<T>, syn::Token![,]>::parse_terminated(input)?.into_iter().collect())) 27 27 } 28 28 }