1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
use hiccup::{SimUpdates, Simulation};
use serde::Deserialize;
use std::fs;
use axum::{
response::{Html, Json},
extract::Query,
routing::get,
Router,
};
async fn root_get() -> Html<String> {
let head = "
<head>
<meta charset=\"UTF-8\">
<title>Hiccup</title>
<script src=\"/main.js\"></script>
</head>
";
let body = "
<body>
<div id=\"main\"></div>
<script>
var app = Elm.Main.init({
node: document.getElementById('main')
});
</script>
</body>
";
Html(format!("<!DOCTYPE html>{head}{body}"))
}
async fn main_get() -> Html<String> {
Html(fs::read_to_string("front/main.js").unwrap())
}
#[derive(Deserialize)]
struct SimSpecs {
principal: f64,
i1: f64,
years: u32,
}
async fn api_simulate_get<'a>(Query(specs): Query<SimSpecs>) -> Json<hiccup::Simulation<'a>> {
let mut sim = Simulation::new(specs. principal, specs.i1, specs.years);
let updates: SimUpdates = SimUpdates::default();
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_get))
.route("/api/simulate", get(api_simulate_get));
// 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();
}
|