use std::env; use axum::http::HeaderValue; use sqlx::{Pool, Postgres}; use tokio::net::TcpListener; use tower_http::{ cors::{self, CorsLayer}, services::ServeDir, }; use crate::{ Result, api::{self, AppState}, }; pub type Router = axum::Router; pub(super) async fn start(pool: Pool) -> Result<()> { let cors_origin = env::var("CORS_ALLOW_ORIGIN").unwrap_or("*".to_string()); let serve_dir = std::env::var("SERVE_DIRECTORY")?; let mut app = Router::new() .nest("/api", api::router()) .layer( CorsLayer::new().allow_origin(cors::AllowOrigin::exact(HeaderValue::from_str( &cors_origin, )?)), ) .with_state(AppState::new(pool, serve_dir)); if !cfg!(debug_assertions) { let frontend_path = env::var("STATIC_FRONTEND_DIR").unwrap_or("./frontend".to_string()); let frontend_service = ServeDir::new(frontend_path); log::debug!("Registering static frontend"); app = app.fallback_service(frontend_service); } let addr = env::var("BIND_ADDRESS").unwrap_or("127.0.0.1:8080".to_string()); let listener = TcpListener::bind(&addr).await?; log::info!("Listening on {}", addr); axum::serve(listener, app).await?; Ok(()) }