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(())
}
}