use std::{net::SocketAddr, sync::Arc}; use tracing::Level; use tracing_subscriber::EnvFilter; use crate::state::AppState; pub mod router; pub mod state; pub mod templates; #[tokio::main] async fn main() { tracing_subscriber::fmt::fmt() .with_env_filter( EnvFilter::builder() .with_default_directive(Level::INFO.into()) .from_env_lossy(), ) .compact() .init(); let addr = SocketAddr::from(( [0, 0, 0, 0], std::env::var("PORT") .ok() .and_then(|s| s.parse::().ok()) .unwrap_or(3713), )); let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); let state = Arc::new(AppState::new()); let app = router::build(state); tracing::info!("hi! serving on {addr}... (^_^)"); tokio::select! { res = axum::serve(listener, app) => { if let Err(e) = res { tracing::error!("oops: serve failed: {e}! (@,@)"); } } _ = tokio::signal::ctrl_c() => { tracing::info!("received ctrl-c! bye bye... (T.T)/"); } } }