use axum::{routing::{get, post}, Router}; use tower_http::{cors::CorsLayer, trace::TraceLayer}; use tracing_subscriber::EnvFilter; use rustvital_amd::{handlers, state::AppState}; #[tokio::main] async fn main() -> anyhow::Result<()> { dotenvy::dotenv().ok(); tracing_subscriber::fmt() .json() .with_env_filter(EnvFilter::from_default_env()) .with_current_span(true) .with_span_events(tracing_subscriber::fmt::format::FmtSpan::CLOSE) .init(); let state = AppState::from_env()?; let port = std::env::var("PORT").unwrap_or_else(|_| "7860".to_string()); let addr = format!("0.0.0.0:{port}"); tracing::info!("starting RustVital-AMD on {}", addr); let app = Router::new() .route("/", get(handlers::index)) .route("/health", get(handlers::health)) .route("/status", get(handlers::status)) .route("/dashboard", get(handlers::dashboard)) .route("/history", get(handlers::history_json)) .route("/triage", post(handlers::triage_json)) .route("/triage/html", post(handlers::triage_html)) .route("/triage/stream", get(handlers::triage_stream)) .route("/agents/status", get(handlers::agents_ws)) .route("/dicom/redact", post(handlers::dicom_redact)) .route("/medical/enrich", get(handlers::enrich_medical)) .route("/trigger-federated-tune", post(handlers::trigger_federated_tune)) .route("/federation/round", get(handlers::federation_round)) .with_state(state) .layer(CorsLayer::permissive()) .layer(TraceLayer::new_for_http()); let listener = tokio::net::TcpListener::bind(&addr).await?; axum::serve(listener, app).await?; Ok(()) }