use std::sync::{Arc, Mutex};
use trillium::{Conn, KnownHeaderName};
use trillium_router::Router;
struct State {
shutdown: trillium_smol::Stopper,
}
async fn index(conn: Conn) -> Conn {
conn.with_header(KnownHeaderName::ContentType, "text/html; charset=utf=8").ok(r#"Hello World. <form method="post" action="/shutdown"><input type="submit" value="Shut Down"></form>"#).halt()
}
async fn shutdown(conn: Conn) -> Conn {
conn.state::<Arc<Mutex<State>>>()
.unwrap()
.lock()
.unwrap()
.shutdown
.stop();
conn.ok("Shutting down")
}
fn main() {
let stopper = trillium_smol::Stopper::new();
let state = Arc::new(Mutex::new(State {
shutdown: stopper.clone(),
}));
let app = Router::new()
.get("/", index)
.post("/shutdown", (trillium::state(state), shutdown));
let config = trillium_smol::config()
.with_stopper(stopper)
.with_host("127.0.0.1")
.with_port(8080);
drteeth::launch("Trillium Demo", "http://127.0.0.1:8080/", async move {
config.run_async(app).await;
})
.unwrap();
}