use crate::rubase::BaseEntitySingle;
use std::sync::{ Mutex };
use actix_web::web;
use crate::rulog;
use crate::ruweb::webrouter;
use crate::ruweb::webrouter::route_factroy::with_container_mut;
pub type RouteConfigFn = dyn Fn(&mut web::ServiceConfig) + Send + Sync + 'static;
#[derive()]
pub struct RouteContainer {
configs: Mutex<Vec<Box<RouteConfigFn>>>,
}
impl BaseEntitySingle for RouteContainer {}
impl RouteContainer {
pub fn new() -> Self {
Self {
configs: Mutex::new(Vec::new()),
}
}
pub fn add<F>(&self, config_fn: F) -> &Self
where
F: Fn(&mut web::ServiceConfig) + Send + Sync + 'static,
{
let mut guard = self.configs.lock().unwrap();
guard.push(Box::new(config_fn));
self
}
pub fn add_all<F>(&self, config_fns: Vec<F>) -> &Self
where
F: Fn(&mut web::ServiceConfig) + Send + Sync + 'static,
{
let mut guard = self.configs.lock().unwrap();
for config_fn in config_fns {
guard.push(Box::new(config_fn));
}
self
}
pub fn apply_routes(&self, cfg: &mut web::ServiceConfig) {
self.list_routes();
let mut guard = self.configs.lock().unwrap();
for config_fn in guard.iter_mut() {
config_fn(cfg);
}
}
pub fn list_routes(&self ) {
let mut guard = self.configs.lock().unwrap();
for item in guard.iter() {
let ptr = item as *const Box<dyn Fn(&mut web::ServiceConfig) + Send + Sync>;
rulog::info2("执行路由:", format!("{:p}", ptr).to_string());
}
}
}
pub fn register_route<F>(config_api_route: F) -> ()
where
F: Fn(&mut web::ServiceConfig) + Send + Sync + 'static,
{
with_container_mut(|container| {
container.add(config_api_route);
println!("✅ API routes registered");
});
}
pub fn register_route_all<F>(config_api_routes: Vec<F>) -> ()
where
F: Fn(&mut web::ServiceConfig) + Send + Sync + 'static,
{
with_container_mut(|container| {
container.add_all(config_api_routes);
println!("✅ API routes registered");
});
}
pub fn register_route_path<F>(config_api_route: F) -> ()
where
F: Fn(&mut web::ServiceConfig) + Send + Sync + 'static,
{
webrouter::register_route::<F>(config_api_route);
}