diff --git a/packages/fullstack-macro/src/lib.rs b/packages/fullstack-macro/src/lib.rs index 325ef7748..835aab1e3 100644 --- a/packages/fullstack-macro/src/lib.rs +++ b/packages/fullstack-macro/src/lib.rs @@ -432,6 +432,15 @@ fn route_impl_with_route( let extracted_as_server_headers = route.extracted_as_server_headers(query_tokens.clone()); + // Generate extraction code based on whether there are server extractors + let extraction_code = if route.server_args.is_empty() { + quote! { Default::default() } + } else { + quote! { + dioxus_fullstack::FullstackContext::extract::<(#(#server_types,)*), _>().await? + } + }; + Ok(quote! { #(#fn_docs)* #route_docs @@ -554,8 +563,12 @@ fn route_impl_with_route( ) } - // Extract the server arguments from the context - let (#(#server_names,)*) = dioxus_fullstack::FullstackContext::extract::<(#(#server_types,)*), _>().await?; + // Extract the server arguments from the context if needed. + // If there are no server extractors, use Default::default() which allows + // the function to be called from backend code without HTTP context. + // If there are server extractors, extraction will fail with a clear error + // when called from backend code without HTTP context. + let (#(#server_names,)*) = #extraction_code; // Call the function directly return #fn_on_server_name #ty_generics(