use std::sync::Arc; use sqlx::{postgres::PgPoolOptions, Pool, Postgres}; use tokio::net::TcpListener; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; use unnamed_server::{state::AppState, Error}; #[tokio::main] #[tracing::instrument] async fn main() -> Result<(), Error> { tracing_subscriber::registry() .with( tracing_subscriber::EnvFilter::try_from_default_env() .unwrap_or_else(|_| "unnamed_server=debug".into()), ) .with(tracing_subscriber::fmt::layer()) .init(); // TODO: Migrate all of these into a struct parsed from env, cli, and file. let _ = dotenvy::dotenv(); let listen_addr = std::env::var("ADDRESS").unwrap_or("127.0.0.1:30000".to_string()); let jwt_max_age: time::Duration = time::Duration::HOUR; // serde_json::from_str(&std::env::var("JWT_MAX_AGE").unwrap_or_else(|_| "1h".to_string()))?; let jwt_secret = std::env::var("JWT_SECRET").expect("JWT_SECRET is not set"); let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL is not set"); let pool = init_db(&database_url).await?; let state = Arc::new(AppState { pool, jwt_secret, jwt_max_age, }); let app = unnamed_server::init_router(state); let listener = TcpListener::bind(listen_addr).await?; tracing::info!("Server listening on http://{}", listener.local_addr()?); axum::serve(listener, app).await.map_err(From::from) } async fn init_db(uri: &str) -> Result, sqlx::Error> { let pool = PgPoolOptions::new() .max_connections(10) .connect(uri) .await?; sqlx::migrate!().run(&pool).await?; Ok(pool) }