use crate::rubase::BaseEntitySingle;
use crate::rulog;
use crate::ruweb::webdto;
use crate::ruweb::webdto::web_route::WebRoute;
use std::sync::{Arc, Mutex, Once, OnceLock};
#[derive(Default, Clone, Debug)]
pub struct WebRouteList {
items: Arc<Vec<WebRoute>>,
}
impl BaseEntitySingle for WebRouteList {}
impl WebRouteList {
pub fn new() -> Self {
Self {
items: Arc::new(Vec::<WebRoute>::new()),
}
}
pub fn add_item(&mut self, item: WebRoute) {
let mut data_mut = Arc::make_mut(&mut self.items); data_mut.push(item);
}
pub fn find_item(&self, name: &str) -> &WebRoute {
for item in self.items.iter() {
if item.name.as_str() == name {
return item;
}
}
&self.items[0]
}
pub fn list_items(&self) {
self.items.iter().for_each(|item| {
rulog::info2("route:", item);
})
}
pub fn push(arc: &mut Arc<WebRouteList>, item: WebRoute) {
let this = Arc::make_mut(arc);
let data_mut = Arc::make_mut(&mut this.items);
data_mut.push(item);
}
}
pub fn reg_route(name: &str, path: &str, method: &str, handler: &str) {
let mut list = webdto::find_bean_web_route_list().unwrap();
let mut w = WebRoute::default();
w.name = name.to_string();
w.path = path.to_string();
w.method = method.to_string();
w.handler = handler.to_string();
webdto::init_container().lock().unwrap().add_item(w);
}
pub static ROUTE_CONTAINER: OnceLock<Mutex<WebRouteList>> = OnceLock::new();
pub static INIT_ONCE: Once = Once::new();
pub fn init_container() -> &'static Mutex<WebRouteList> {
INIT_ONCE.call_once(|| {
let container = WebRouteList::new();
ROUTE_CONTAINER.set(Mutex::new(container));
println!("✅ Route Container initialized");
});
ROUTE_CONTAINER.get().unwrap()
}
pub fn list_items() {
webdto::init_container().lock().unwrap().list_items();
}