#[cfg(any(feature = "ssr", doc))]
use crate::ServerFnTraitObj;
pub use server_fn_macro_default::server;
#[cfg(any(feature = "ssr", doc))]
use std::{
collections::HashMap,
sync::{Arc, RwLock},
};
#[cfg(any(feature = "ssr", doc))]
lazy_static::lazy_static! {
static ref REGISTERED_SERVER_FUNCTIONS: Arc<RwLock<HashMap<&'static str, &'static DefaultServerFnTraitObj>>> = {
let mut map = HashMap::new();
for server_fn in inventory::iter::<DefaultServerFnTraitObj> {
map.insert(server_fn.0.url(), server_fn);
}
Arc::new(RwLock::new(map))
};
}
#[cfg(feature = "ssr")]
inventory::collect!(DefaultServerFnTraitObj);
#[cfg(any(feature = "ssr", doc))]
pub fn server_fn_by_path(
path: &str,
) -> Option<&'static DefaultServerFnTraitObj> {
REGISTERED_SERVER_FUNCTIONS
.read()
.expect("Server function registry is poisoned")
.get(path)
.copied()
}
#[cfg(any(feature = "ssr", doc))]
pub fn server_fns_by_path() -> Vec<&'static str> {
REGISTERED_SERVER_FUNCTIONS
.read()
.expect("Server function registry is poisoned")
.keys()
.copied()
.collect()
}
#[cfg(any(feature = "ssr", doc))]
pub struct DefaultServerFnTraitObj(ServerFnTraitObj<()>);
#[cfg(any(feature = "ssr", doc))]
impl DefaultServerFnTraitObj {
pub const fn from_generic_server_fn(f: ServerFnTraitObj<()>) -> Self {
Self(f)
}
}
#[cfg(any(feature = "ssr", doc))]
impl std::ops::Deref for DefaultServerFnTraitObj {
type Target = ServerFnTraitObj<()>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[cfg(any(feature = "ssr", doc))]
impl std::ops::DerefMut for DefaultServerFnTraitObj {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}