mod auth; mod config; mod db; mod error; mod models; mod routes; mod s3; mod schema; mod state; use std::net::SocketAddr; use tokio::net::TcpListener; use tower::make::Shared; use tracing_subscriber::EnvFilter; use crate::auth::jwt::JwtService; use crate::config::AppConfig; use crate::s3::build_client; use crate::state::AppState; #[tokio::main] async fn main() -> anyhow::Result<()> { dotenv::dotenv().ok(); init_tracing(); let config = AppConfig::from_env()?; let pool = db::init_pool(&config.database_url)?; let s3_client = build_client(&config).await?; let jwt = JwtService::from_config(&config)?; let state = AppState::new(pool, config, s3_client, jwt); let router = routes::create_router(state.clone()); let addr: SocketAddr = format!("{}:{}", state.config.server_host, state.config.server_port).parse()?; let listener = TcpListener::bind(addr).await?; tracing::info!("listening on {}", addr); axum::serve(listener, Shared::new(router)).await?; Ok(()) } fn init_tracing() { let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); tracing_subscriber::fmt() .with_env_filter(filter) .with_target(false) .compact() .init(); }