Allow prefixes for server function routes

This commit is contained in:
Greg Johnston 2022-11-14 07:21:05 -05:00
parent d9f07111e0
commit f8de0fff81
4 changed files with 26 additions and 13 deletions

View File

@ -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;

View File

@ -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>,

View File

@ -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"

View File

@ -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 })
}
}