use crate::{routing::{router::Router, routes::Routes}, server::Server, utils::vec};
pub(crate) struct Resolver {}
impl Resolver {
pub fn new(server: &mut Server) {
Self::resolve(&mut server.routes, &mut server.routers);
server.routers.clear();
}
fn resolve(server: &mut Routes, nodes: &mut Vec<Router>) {
for router in nodes {
Self::recursive(server, router);
}
}
fn recursive(routes: &mut Routes, router: &mut Router) {
for group in &router.groups {
let mut middlewares = router.middlewares.clone();
middlewares.extend(group.middlewares.clone());
router.routers.push(Router::new(
router.server.clone(),
group.subdomain.clone(),
vec::merge(router.path.clone(), group.path.clone()),
middlewares,
));
let last = router.routers.len() - 1;
group.call(&mut router.routers[last]);
}
routes.http.append(&mut router.http);
routes.websocket.append(&mut router.websocket);
Self::resolve(routes, &mut router.routers);
}
}