toni 0.1.1

Fast and modular web framework for scalable applications
Documentation
use std::{cell::RefCell, rc::Rc};

use anyhow::Result;

use crate::{
    http_adapter::HttpAdapter,
    injector::ToniContainer,
};

pub struct RoutesResolver {
    container: Rc<RefCell<ToniContainer>>
}

impl RoutesResolver {
    pub fn new(container: Rc<RefCell<ToniContainer>>) -> Self {
        Self {
            container
        }
    }

    pub fn resolve(&mut self, http_adapter: &mut impl HttpAdapter) -> Result<()> {
        let modules_token = self.container.borrow().get_modules_token();

        for module_token in modules_token {
            self.register_routes(module_token, http_adapter)?;
        }
        Ok(())
    }

    fn register_routes(&mut self, module_token: String, http_adapter: &mut impl HttpAdapter) -> Result<()> {
        let mut container = self.container.borrow_mut();
        let controllers = container.get_controllers_instance(&module_token)?;
        for (_, controller) in controllers {
            http_adapter
                .add_route(&controller.get_path(), controller.get_method(), controller);
        }
        Ok(())
    }
}