use axum::Router; use sqlx::sqlite::SqlitePool; use std::net::SocketAddr; use tower_http::services::ServeDir; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; mod place; mod routes; #[tokio::main] async fn main() { dotenvy::dotenv().unwrap_or_default(); tracing_subscriber::registry() .with( tracing_subscriber::EnvFilter::try_from_default_env() .unwrap_or_else(|_| "huellas=debug".into()), ) .with(tracing_subscriber::fmt::layer()) .init(); let db_url = dotenvy::var("DATABASE_URL").expect("DATABASE_URL not defined"); let pool = SqlitePool::connect(&db_url) .await .expect("can't connect to database"); sqlx::migrate!() .run(&pool) .await .expect("couldn't run migrations"); let app = Router::new() .nest("/places", routes::places_routes(pool)) .nest_service("/", ServeDir::new("static")); let port = dotenvy::var("PORT").unwrap_or_default(); let port = str::parse(&port).unwrap_or(3000); let address = SocketAddr::from(([0, 0, 0, 0], port)); tracing::debug!("listening on {}", address); axum::Server::bind(&address) .serve(app.into_make_service()) .with_graceful_shutdown(shutdown_signal()) .await .unwrap(); } async fn shutdown_signal() { tokio::signal::ctrl_c() .await .expect("Ctrl-C shutdown signal"); println!("Received shutdown signal"); }