1use std::sync::Arc;
2
3use axum::{Extension, Router};
4
5#[cfg(feature = "auth")]
6use crate::layer::auth::apply_auth_layer;
7#[cfg(feature = "postgres")]
8use crate::layer::database::apply_database_layer;
9#[cfg(feature = "log")]
10use crate::layer::log::apply_log_layer;
11use server_config::app::AppConfig;
12use tokio::net::TcpListener;
13use tracing::info;
14
15pub async fn start(app: Router) {
18 let config = AppConfig::from_env().unwrap();
20 let server_name = &config.server_name;
22 let server_host = &config.server_host;
24 let server_port = &config.server_port;
26
27 #[cfg(feature = "log")]
30 let (app, _wg) = apply_log_layer(app, &config);
32
33 #[cfg(feature = "auth")]
34 let app = apply_auth_layer(app, &config);
35
36 #[cfg(feature = "postgres")]
37 let app = apply_database_layer(app, &config).await;
38
39 let app = app.layer(Extension(Arc::new(config.clone())));
41
42 info!(
44 "Starting {}: http://{}:{}",
45 server_name, server_host, server_port
46 );
47
48 let listener = TcpListener::bind(format!("{}:{}", server_host, server_port))
50 .await
51 .unwrap();
52 axum::serve(listener, app).await.unwrap();
54}