diff --git a/packages/fullstack/examples/axum-auth/src/main.rs b/packages/fullstack/examples/axum-auth/src/main.rs index 0288f4d82..00ddb95f9 100644 --- a/packages/fullstack/examples/axum-auth/src/main.rs +++ b/packages/fullstack/examples/axum-auth/src/main.rs @@ -121,23 +121,22 @@ fn app(cx: Scope) -> Element { } #[server(GetUserName)] -pub async fn get_user_name( - #[extract] session: crate::auth::Session, -) -> Result { +pub async fn get_user_name() -> Result { + let session: crate::auth::Session = extract().await?; Ok(session.0.current_user.unwrap().username.to_string()) } #[server(Login)] -pub async fn login(#[extract] auth: crate::auth::Session) -> Result<(), ServerFnError> { +pub async fn login() -> Result<(), ServerFnError> { + let auth: crate::auth::Session = extract().await?; auth.login_user(2); Ok(()) } #[server(Permissions)] -pub async fn get_permissions( - #[extract] method: axum::http::Method, - #[extract] auth: crate::auth::Session, -) -> Result { +pub async fn get_permissions() -> Result { + let method: axum::http::Method = extract().await?; + let auth: crate::auth::Session = extract().await?; let current_user = auth.current_user.clone().unwrap_or_default(); // lets check permissions only and not worry about if they are anon or not diff --git a/packages/fullstack/server-macro/src/lib.rs b/packages/fullstack/server-macro/src/lib.rs index a0c4cbb39..d00c009d0 100644 --- a/packages/fullstack/server-macro/src/lib.rs +++ b/packages/fullstack/server-macro/src/lib.rs @@ -5,7 +5,6 @@ use quote::{ToTokens, __private::TokenStream as TokenStream2}; use server_fn_macro::*; use syn::{ parse::{Parse, ParseStream}, - spanned::Spanned, Ident, ItemFn, Token, }; @@ -67,22 +66,6 @@ pub fn server(args: proc_macro::TokenStream, s: TokenStream) -> TokenStream { Err(e) => return e.into(), }; - // find all arguments with the #[extract] attribute - let mut extractors: Vec = vec![]; - function.sig.inputs = function - .sig - .inputs - .into_iter() - .filter(|arg| { - if let Ok(extractor) = syn::parse2(arg.clone().into_token_stream()) { - extractors.push(extractor); - false - } else { - true - } - }) - .collect(); - // extract all #[middleware] attributes let mut middlewares: Vec = vec![]; function.attrs.retain(|attr| { @@ -107,7 +90,6 @@ pub fn server(args: proc_macro::TokenStream, s: TokenStream) -> TokenStream { let mapped_body = quote::quote! { #(#attrs)* #vis #sig { - #(#extractors)* #block } }; @@ -155,45 +137,6 @@ pub fn server(args: proc_macro::TokenStream, s: TokenStream) -> TokenStream { } } -struct Extractor { - pat: syn::PatType, -} - -impl ToTokens for Extractor { - fn to_tokens(&self, tokens: &mut TokenStream2) { - let pat = &self.pat; - tokens.extend(quote::quote! { - let #pat = ::dioxus_fullstack::prelude::extract_server_context().await?; - }); - } -} - -impl Parse for Extractor { - fn parse(input: syn::parse::ParseStream) -> syn::Result { - let arg: syn::FnArg = input.parse()?; - match arg { - syn::FnArg::Typed(mut pat_type) => { - let mut contains_extract = false; - pat_type.attrs.retain(|attr| { - let is_extract = attr.path().is_ident("extract"); - if is_extract { - contains_extract = true; - } - !is_extract - }); - if !contains_extract { - return Err(syn::Error::new( - pat_type.span(), - "expected an argument with the #[extract] attribute", - )); - } - Ok(Extractor { pat: pat_type }) - } - _ => Err(syn::Error::new(arg.span(), "expected a typed argument")), - } - } -} - #[derive(Debug)] struct Middleware { expr: syn::Expr, diff --git a/packages/fullstack/src/lib.rs b/packages/fullstack/src/lib.rs index ddac47f3a..4728c1846 100644 --- a/packages/fullstack/src/lib.rs +++ b/packages/fullstack/src/lib.rs @@ -47,8 +47,7 @@ pub mod prelude { pub use crate::server_context::Axum; #[cfg(feature = "ssr")] pub use crate::server_context::{ - extract_server_context, server_context, DioxusServerContext, FromServerContext, - ProvideServerContext, + extract, server_context, DioxusServerContext, FromServerContext, ProvideServerContext, }; pub use crate::server_fn::DioxusServerFn; #[cfg(feature = "ssr")] diff --git a/packages/fullstack/src/server_context.rs b/packages/fullstack/src/server_context.rs index 681a5661f..fcd0ef66b 100644 --- a/packages/fullstack/src/server_context.rs +++ b/packages/fullstack/src/server_context.rs @@ -117,7 +117,7 @@ pub fn server_context() -> DioxusServerContext { /// Extract some part from the current server request. /// /// This function will only provide the current server context if it is called from a server function or on the server rendering a request. -pub async fn extract_server_context, I>() -> Result { +pub async fn extract, I>() -> Result { E::from_request(&server_context()).await }