Allow prefixes for server function routes
This commit is contained in:
parent
d9f07111e0
commit
f8de0fff81
|
@ -26,12 +26,13 @@ lazy_static::lazy_static! {
|
|||
pub static ref COUNT_CHANNEL: BroadcastChannel<i32> = BroadcastChannel::new();
|
||||
}
|
||||
|
||||
#[server(GetServerCount)]
|
||||
// "/api" is an optional prefix that allows you to locate server functions wherever you'd like on the server
|
||||
#[server(GetServerCount, "/api")]
|
||||
pub async fn get_server_count() -> Result<i32, ServerFnError> {
|
||||
Ok(COUNT.load(Ordering::Relaxed))
|
||||
}
|
||||
|
||||
#[server(AdjustServerCount)]
|
||||
#[server(AdjustServerCount, "/api")]
|
||||
pub async fn adjust_server_count(delta: i32, msg: String) -> Result<i32, ServerFnError> {
|
||||
let new = COUNT.load(Ordering::Relaxed) + delta;
|
||||
COUNT.store(new, Ordering::Relaxed);
|
||||
|
@ -40,7 +41,7 @@ pub async fn adjust_server_count(delta: i32, msg: String) -> Result<i32, ServerF
|
|||
Ok(new)
|
||||
}
|
||||
|
||||
#[server(ClearServerCount)]
|
||||
#[server(ClearServerCount, "/api")]
|
||||
pub async fn clear_server_count() -> Result<i32, ServerFnError> {
|
||||
COUNT.store(0, Ordering::Relaxed);
|
||||
_ = COUNT_CHANNEL.send(&0).await;
|
||||
|
|
|
@ -34,7 +34,7 @@ async fn render(req: HttpRequest) -> impl Responder {
|
|||
))
|
||||
}
|
||||
|
||||
#[post("{tail:.*}")]
|
||||
#[post("/api/{tail:.*}")]
|
||||
async fn handle_server_fns(
|
||||
req: HttpRequest,
|
||||
params: web::Path<String>,
|
||||
|
|
|
@ -11,6 +11,7 @@ description = "view macro for the Leptos web framework."
|
|||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
cfg-if = "1"
|
||||
proc-macro-error = "1"
|
||||
proc-macro2 = "1"
|
||||
quote = "1"
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
use cfg_if::cfg_if;
|
||||
use proc_macro::Span;
|
||||
use proc_macro2::{TokenStream as TokenStream2};
|
||||
use proc_macro2::{TokenStream as TokenStream2, Literal};
|
||||
use quote::{quote};
|
||||
use syn::{
|
||||
parse::{Parse, ParseStream},
|
||||
|
@ -8,8 +9,8 @@ use syn::{
|
|||
};
|
||||
|
||||
pub fn server_macro_impl(args: proc_macro::TokenStream, s: TokenStream2) -> Result<TokenStream2> {
|
||||
let ServerFnName { struct_name } = syn::parse::<ServerFnName>(args)?;
|
||||
let span = Span::call_site();
|
||||
let ServerFnName { struct_name, comma, prefix } = syn::parse::<ServerFnName>(args)?;
|
||||
let prefix = prefix.unwrap_or_else(|| Literal::string(""));
|
||||
|
||||
let body = syn::parse::<ServerFnBody>(s.into())?;
|
||||
let fn_name = &body.ident;
|
||||
|
@ -17,10 +18,14 @@ pub fn server_macro_impl(args: proc_macro::TokenStream, s: TokenStream2) -> Resu
|
|||
let vis = body.vis;
|
||||
let block = body.block;
|
||||
|
||||
#[cfg(not(feature = "stable"))]
|
||||
let url = format!("{}/{}", span.source_file().path().to_string_lossy(), fn_name_as_str).replace("/", "-");
|
||||
#[cfg(feature = "stable")]
|
||||
let url = fn_name_as_str;
|
||||
cfg_if! {
|
||||
if #[cfg(not(feature = "stable"))] {
|
||||
let span = Span::call_site();
|
||||
let url = format!("{}/{}", span.source_file().path().to_string_lossy(), fn_name_as_str).replace("/", "-");
|
||||
} else {
|
||||
let url = fn_name_as_str;
|
||||
}
|
||||
}
|
||||
|
||||
let fields = body.inputs.iter().map(|f| {
|
||||
let typed_arg = match f {
|
||||
|
@ -146,20 +151,26 @@ pub fn server_macro_impl(args: proc_macro::TokenStream, s: TokenStream2) -> Resu
|
|||
}
|
||||
#[cfg(not(feature = "ssr"))]
|
||||
#vis async fn #fn_name(#(#fn_args_2),*) #output_arrow #return_ty {
|
||||
::leptos::call_server_fn(#struct_name::url(), #struct_name { #(#field_names_5),* }).await
|
||||
let prefix = #prefix.to_string();
|
||||
let url = prefix + "/" + #struct_name::url();
|
||||
::leptos::call_server_fn(&url, #struct_name { #(#field_names_5),* }).await
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
pub struct ServerFnName {
|
||||
struct_name: Ident,
|
||||
comma: Option<Token![,]>,
|
||||
prefix: Option<Literal>
|
||||
}
|
||||
|
||||
impl Parse for ServerFnName {
|
||||
fn parse(input: ParseStream) -> syn::Result<Self> {
|
||||
let struct_name = input.parse()?;
|
||||
let comma = input.parse()?;
|
||||
let prefix = input.parse()?;
|
||||
|
||||
Ok(Self { struct_name })
|
||||
Ok(Self { struct_name, comma, prefix })
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue