use crate::rubase::{ BaseEntitySingle};
use std::sync::{ Mutex };
use actix_web::web;
use crate::rulog;
use crate::ruweb::{webdto, 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>>>,
items: Mutex<Vec<webdto::WebRoute>>,
}
impl BaseEntitySingle for RouteContainer {}
impl RouteContainer {
pub fn new() -> Self {
Self {
configs: Mutex::new(Vec::new()),
items: Mutex::new(Vec::new()),
}
}
pub fn add<F>(&self, config_fn: F,path: &str) -> &Self
where
F: Fn(&mut web::ServiceConfig) + Send + Sync + 'static,
{
let mut guard = self.configs.lock().unwrap();
guard.push(Box::new(config_fn));
let mut item=webdto::WebRoute::default();
item.name=path.to_string();
item.path=path.to_string();
item.method="ident_to_string($method)".to_string();
item.handler="$handler".to_string();
let mut items = self.items.lock().unwrap();
items.push(item);
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 clear_items (&self ) {
self.configs.lock().unwrap() .clear();
}
pub fn apply_routes(&self, cfg: &mut web::ServiceConfig) {
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 list_routes_items(&self ) {
let mut guard = self.items.lock().unwrap();
for item in guard .iter() {
rulog::info2("注册路由:", item .path.clone());
}
}
}
pub fn register_route<F>(config_api_route: F,path: &str) -> ()
where
F: Fn(&mut web::ServiceConfig) + Send + Sync + 'static,
{
with_container_mut(|container| {
container.add(config_api_route,path);
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 clear_route_items ( ) {
with_container_mut(|container| {
container. configs= Mutex::new(Vec::new())
});
}