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