sinan 0.1.0

A Boilerplate for Rapid Axum Web Service Deployment.
Documentation
use std::collections::HashMap;
use std::path::PathBuf;

use axum::{async_trait, Router};
use once_cell::sync::Lazy;

use crate::facades::{Config, Container, Environment, Template};
use crate::foundation::{BASE_PATH, Logger, RUNTIME, Server, ServerTag};
use crate::services::{Database, Metrics, Redis, ServiceProvider};

#[async_trait]
pub trait Application: Sync + Send {
    fn version() -> &'static str {
        env!("CARGO_PKG_VERSION")
    }

    fn name() -> &'static str {
        env!("CARGO_CRATE_NAME")
    }

    fn base_path() -> &'static PathBuf {
        Lazy::force(&BASE_PATH)
    }

    fn runtime() -> &'static tokio::runtime::Runtime {
        Lazy::force(&RUNTIME)
    }

    fn with_routing() -> HashMap<ServerTag, Vec<Router>>;

    fn with_facades(container: &mut Container) {
        container.register::<Environment>();
        container.register::<Template>();
        container.register::<Config>();
    }

    fn register(service: &mut ServiceProvider) {
        service.register::<Self, Logger>();
        service.register::<Self, Metrics>();
        service.register::<Self, Database>();
        service.register::<Self, Redis>();
        service.register::<Self, Server>();
    }

    fn boot(service: &ServiceProvider) -> eyre::Result<()> {
        service.boot::<Self, Logger>()?;
        service.boot::<Self, Metrics>()?;
        service.boot::<Self, Database>()?;
        service.boot::<Self, Redis>()?;
        service.boot::<Self, Server>()?;

        Ok(())
    }
}