main.rs (1600B)
1 mod data; 2 mod handlers; 3 mod session; 4 5 use std::sync::Arc; 6 use std::time::Instant; 7 8 use axum::routing::{get, post}; 9 use dashmap::DashMap; 10 11 #[tokio::main] 12 async fn main() { 13 println!("Loading CSV data, please wait..."); 14 let t = Instant::now(); 15 16 let candles = tokio::task::spawn_blocking(|| { 17 data::load_csv("data/btc/btcusd_1-min_data.csv.gz").expect("Failed to load CSV") 18 }) 19 .await 20 .unwrap(); 21 22 println!( 23 "Loaded {} candles in {:.1}s. Starting server on http://0.0.0.0:3000", 24 candles.len(), 25 t.elapsed().as_secs_f64() 26 ); 27 28 let state = handlers::AppState { 29 data: Arc::new(data::AppData { candles }), 30 sessions: Arc::new(DashMap::new()), 31 }; 32 33 let app = axum::Router::new() 34 .route("/", get(handlers::serve_html)) 35 .route("/observe", get(handlers::serve_observe_html)) 36 .route("/api/session/new", post(handlers::new_session)) 37 .route("/api/session/{id}/state", get(handlers::get_session_state)) 38 .route("/api/session/{id}/observe", get(handlers::observe_session)) 39 .route("/api/next", post(handlers::next_candle)) 40 .route("/api/predict", post(handlers::predict)) 41 .route("/api/predict/cancel", post(handlers::cancel_predict)) 42 .with_state(state) 43 .layer(tower_http::compression::CompressionLayer::new()); 44 45 let port = std::env::var("PORT").unwrap_or_else(|_| "3000".to_string()); 46 let addr = format!("0.0.0.0:{}", port); 47 let listener = tokio::net::TcpListener::bind(&addr).await.unwrap(); 48 axum::serve(listener, app).await.unwrap(); 49 }