use hiccup::{SimUpdates, Simulation}; use serde::Deserialize; use std::fs; use axum::{ http::header::CONTENT_TYPE, response::{Html, Json, IntoResponse}, routing::{get, post}, Router, }; async fn root_get() -> Html { let head = " Hiccup "; let body = "
"; Html(format!("{head}{body}")) } async fn main_js_get() -> impl IntoResponse { ([(CONTENT_TYPE, "text/javascript")], fs::read_to_string("front/main.js").unwrap()) } async fn main_css_get() -> impl IntoResponse { ([(CONTENT_TYPE, "text/css")], fs::read_to_string("front/main.css").unwrap()) } #[derive(Deserialize)] struct SimSpecs { principal: f64, i1: f64, years: u32, updates: SimUpdates } async fn api_simulate_post(Json(specs): Json) -> Json { let mut sim = Simulation::new(specs.principal, specs.i1, specs.years); let updates: SimUpdates = specs.updates; sim.run(updates); Json(sim) } #[tokio::main] async fn main() { // build our application with a single route let app = Router::new() .route("/", get(root_get)) .route("/main.js", get(main_js_get)) .route("/main.css", get(main_css_get)) .route("/api/simulate", post(api_simulate_post)); // run our app with hyper, listening globally on port 3000 let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); axum::serve(listener, app).await.unwrap(); }