1use std::sync::Arc;
2
3use axum::{Extension, Router};
4
5#[cfg(any(feature = "log", feature = "auth"))]
6use axum::middleware::from_fn;
7#[cfg(feature = "auth")]
8use server_common::jwt::JwtService;
9use server_config::app::AppConfig;
10#[cfg(feature = "postgres")]
11use server_database::connect_db;
12#[cfg(feature = "auth")]
13use server_middleware::middleware::auth::auth_middleware;
14#[cfg(feature = "log")]
15use server_middleware::middleware::log::logging_middleware;
16use tokio::net::TcpListener;
17#[cfg(feature = "log")]
18use trace_log::{LogLevel, init_logger};
19use tracing::info;
20
21pub async fn start(app: Router) {
24 let config = AppConfig::from_env().unwrap();
26 let server_name = &config.server_name;
28 let server_host = &config.server_host;
30 let server_port = &config.server_port;
32
33 #[cfg(feature = "log")]
34 let _wg = match &config.log {
35 Some(data) => {
36 let level = match &data.level.parse::<LogLevel>() {
37 Ok(level) => level.clone(),
38 Err(_) => LogLevel::Debug,
39 };
40 let wg = init_logger(level);
41 Some(wg)
42 }
43 None => None,
44 };
45
46 #[cfg(feature = "auth")]
49 let app = match &config.jwt {
51 Some(_) => app.layer(from_fn(auth_middleware)),
52 None => app,
53 };
54
55 #[cfg(feature = "log")]
56 let app = match &config.log {
58 Some(data) if data.http => app.layer(from_fn(logging_middleware)),
59 _ => app,
60 };
61
62 #[cfg(feature = "auth")]
63 let app = match &config.jwt {
65 Some(data) => {
66 let jwt_service = JwtService::new(data.clone());
67 app.layer(Extension(Arc::new(jwt_service)))
68 }
69 None => app,
70 };
71
72 #[cfg(feature = "postgres")]
73 let app = match &config.database {
74 Some(database_config) => {
75 let pg_pool = connect_db(database_config).await.unwrap();
76 let app = app.layer(Extension(Arc::new(pg_pool)));
78 app
79 }
80 None => app,
81 };
82
83 let app = app.layer(Extension(Arc::new(config.clone())));
85
86 info!(
88 "Starting {}: http://{}:{}",
89 server_name, server_host, server_port
90 );
91
92 let listener = TcpListener::bind(format!("{}:{}", server_host, server_port))
94 .await
95 .unwrap();
96 axum::serve(listener, app).await.unwrap();
98}