From bffe2c16e5e21d8c5e7c652b110c7d4f9f979c22 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Mon, 1 Apr 2024 05:57:35 +0000 Subject: feat(rossweisse): remove required phantom data --- examples/struct_router.rs | 4 +- rossweisse/src/implementations/router/fields.rs | 54 ++++++++++++++++--------- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/examples/struct_router.rs b/examples/struct_router.rs index 3401379..d95b76f 100644 --- a/examples/struct_router.rs +++ b/examples/struct_router.rs @@ -21,9 +21,7 @@ use rossweisse::route; use windmark::response::Response; #[rossweisse::router] -struct Router { - _phantom: (), -} +struct Router; #[rossweisse::router] impl Router { diff --git a/rossweisse/src/implementations/router/fields.rs b/rossweisse/src/implementations/router/fields.rs index 6c3941a..1280270 100644 --- a/rossweisse/src/implementations/router/fields.rs +++ b/rossweisse/src/implementations/router/fields.rs @@ -23,13 +23,19 @@ pub fn fields(arguments: TokenStream, item: syn::ItemStruct) -> TokenStream { arguments as super::parser::FieldInitializers ); let router_identifier = item.ident; - let named_fields = match item.fields { - syn::Fields::Named(fields) => fields, - _ => - panic!( - "`#[rossweisse::router]` can only be used on `struct`s with named \ - fields" - ), + let (named_fields, has_fields) = match item.fields { + syn::Fields::Named(fields) => (fields, true), + syn::Fields::Unit => ( + syn::FieldsNamed { + brace_token: syn::token::Brace::default(), + named: Default::default(), + }, + false, + ), + _ => panic!( + "`#[rossweisse::router]` can only be used on `struct`s with named \ + fields or unit structs" + ), }; let mut default_expressions = vec![]; let new_method_fields = named_fields.named.iter().map(|field| { @@ -54,20 +60,22 @@ pub fn fields(arguments: TokenStream, item: syn::ItemStruct) -> TokenStream { #name: #initialiser, } }); - let new_methods = quote! { - fn _new() -> Self { - Self { - #(#new_method_fields)* - router: ::windmark::router::Router::new(), + let new_methods = if has_fields { + quote! { + fn _new() -> Self { + Self { + #(#new_method_fields)* + router: ::windmark::router::Router::new(), + } } } - - pub async fn run(&mut self) -> Result<(), Box> { - self.router.run().await - } - - pub fn router(&mut self) -> &mut ::windmark::router::Router { - &mut self.router + } else { + quote! { + fn _new() -> Self { + Self { + router: ::windmark::router::Router::new(), + } + } } }; let output_fields = named_fields.named; @@ -79,6 +87,14 @@ pub fn fields(arguments: TokenStream, item: syn::ItemStruct) -> TokenStream { impl #router_identifier { #new_methods + + pub async fn run(&mut self) -> Result<(), Box> { + self.router.run().await + } + + pub fn router(&mut self) -> &mut ::windmark::router::Router { + &mut self.router + } } }; -- cgit v1.2.3