use crate::utils::aliases::{AEngine, PendingUrls};
use std::sync::LazyLock;
use std::sync::Mutex;
pub static PENDING_URLS: LazyLock<Mutex<PendingUrls>> = LazyLock::new(|| Mutex::new(Vec::new()));
pub fn register_pending(name: impl Into<String>, path: impl Into<String>) {
let mut pending = PENDING_URLS.lock().unwrap_or_else(|e| e.into_inner());
pending.push((name.into(), path.into()));
}
pub fn register_name_url(engine: &AEngine, name: impl Into<String>, path: impl Into<String>) {
let mut map = engine
.url_registry
.write()
.unwrap_or_else(|e| e.into_inner());
map.insert(name.into(), path.into());
}
pub fn reverse(engine: &AEngine, name: &str) -> Option<String> {
let map = engine
.url_registry
.read()
.unwrap_or_else(|e| e.into_inner());
map.get(name).cloned()
}
pub fn reverse_with_parameters(
engine: &AEngine,
name: &str,
parameters: &[(&str, &str)],
) -> Option<String> {
let path = reverse(engine, name)?;
let result = parameters
.iter()
.fold(path, |acc, (k, v)| acc.replace(&format!("{{{}}}", k), v));
Some(result)
}
pub fn add_urls(engine: &AEngine) {
let mut pending = PENDING_URLS.lock().unwrap_or_else(|e| e.into_inner());
let mut map = engine
.url_registry
.write()
.unwrap_or_else(|e| e.into_inner());
for (name, path) in pending.drain(..) {
map.insert(name, path);
}
}