toni 0.1.0

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

use anyhow::Result;

use crate::module_helpers::module_enum::ModuleDefinition;
use crate::toni_application::ToniApplication;
use crate::{
    http_adapter::HttpAdapter,
    injector::{ToniContainer, ToniInstanceLoader},
    scanner::ToniDependenciesScanner,
};

#[derive(Default)]
pub struct ToniFactory;

impl ToniFactory {
    #[inline]
    pub fn new() -> Self {
        Self
    }

    pub fn create(
        &self,
        module: ModuleDefinition,
        http_adapter: impl HttpAdapter
    ) -> ToniApplication<impl HttpAdapter> 
    {
        let container = Rc::new(RefCell::new(ToniContainer::new()));
        
        match self.initialize(module, container.clone()) {
            Ok(_) => (),
            Err(e) => {
                eprintln!("Falha crítica na inicialização do módulo: {}", e);
                std::process::exit(1);
            }
        };
        
        let mut app = ToniApplication::new(http_adapter, container);
        match app.init() {
            Ok(_) => (),
            Err(e) => {
                eprintln!("Falha na inicialização da aplicação: {}", e);
                std::process::exit(1);
            }
        }
        
        app
    }

    fn initialize(
        &self,
        module: ModuleDefinition,
        container: Rc<RefCell<ToniContainer>>
    ) -> Result<()> {
        let mut scanner = ToniDependenciesScanner::new(container.clone());
        scanner.scan(module)?;

        ToniInstanceLoader::new(container.clone())
            .create_instances_of_dependencies()?;

        Ok(())
    }
}