use std::mem;
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);
if router.not_found_callback.is_some() {
routes.not_found_callback = mem::take(&mut router.not_found_callback);
}
Self::resolve(routes, &mut router.routers);
}
}