1use std::{net::SocketAddr, sync::Arc};
2
3use tracing::Level;
4use tracing_subscriber::EnvFilter;
5
6use crate::state::AppState;
7
8pub mod router;
9pub mod state;
10pub mod templates;
11
12#[tokio::main]
13async fn main() {
14 tracing_subscriber::fmt::fmt()
15 .with_env_filter(
16 EnvFilter::builder()
17 .with_default_directive(Level::INFO.into())
18 .from_env_lossy(),
19 )
20 .compact()
21 .init();
22
23 let addr = SocketAddr::from((
24 [0, 0, 0, 0],
25 std::env::var("PORT")
26 .ok()
27 .and_then(|s| s.parse::<u16>().ok())
28 .unwrap_or(3713),
29 ));
30 let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
31
32 let state = Arc::new(AppState::new());
33 let app = router::build(state);
34
35 tracing::info!("hi! serving on {addr}... (^_^)");
36 tokio::select! {
37 res = axum::serve(listener, app) => {
38 if let Err(e) = res {
39 tracing::error!("oops: serve failed: {e}! (@,@)");
40 }
41 }
42 _ = tokio::signal::ctrl_c() => {
43 tracing::info!("received ctrl-c! bye bye... (T.T)/");
44 }
45 }
46}