toni 0.1.0

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, router::RoutesResolver,
};

pub struct ToniApplication<H: HttpAdapter> {
    http_adapter: H,
    routes_resolver: RoutesResolver,
}

impl<H: HttpAdapter> ToniApplication<H> {
    pub fn new(http_adapter: H, container: Rc<RefCell<ToniContainer>>) -> Self {
        Self {
            http_adapter,
            routes_resolver: RoutesResolver::new(container.clone()),
        }
    }

    pub fn init(&mut self) -> Result<()> {
        self.routes_resolver.resolve(&mut self.http_adapter)?;
        Ok(())
    }
    pub async fn listen(self, port: u16, hostname: &str) {
        if let Err(e) = self.http_adapter.listen(port, hostname).await {
            eprintln!("🚨 Failed to start server: {}", e);
            std::process::exit(1);
        }
    }
}