use std::net::Ipv4Addr;
use axum::{extract::FromRef, response::IntoResponse, routing::get, serve, Router};
use axum_template::{engine::Engine, RenderHtml};
use handlebars::Handlebars;
use tokio::net::TcpListener;
type AppEngine = Engine<Handlebars<'static>>;
async fn get_luck(
engine: AppEngine,
) -> impl IntoResponse {
let key = if rand::random::<u8>() % 6 == 0 {
"lucky"
} else {
"unlucky"
};
RenderHtml(key, engine, &())
}
#[derive(Clone, FromRef)]
struct AppState {
engine: AppEngine,
}
#[tokio::main]
async fn main() {
let mut hbs = Handlebars::new();
hbs.register_template_string("lucky", "<h1>Winner winner chicken dinner</h1>")
.unwrap();
hbs.register_template_string("unlucky", "<h1>Try again!</h1>")
.unwrap();
let app = Router::new()
.route("/example", get(get_luck))
.with_state(AppState {
engine: Engine::from(hbs),
});
println!("See example: http://127.0.0.1:8080/example");
let listener = TcpListener::bind((Ipv4Addr::LOCALHOST, 8080))
.await
.unwrap();
serve(listener, app.into_make_service()).await.unwrap();
}