//! Simple usage of using `axum_template` with the `handlebars` crate //! //! Run the example using //! //! ```sh //! cargo run --example=handlebars --features=handlebars //! ``` use std::net::Ipv4Addr; use axum::{ extract::{FromRef, Path}, response::IntoResponse, routing::get, serve, Router, }; use axum_template::{engine::Engine, Key, RenderHtml}; use handlebars::Handlebars; use serde::Serialize; use tokio::net::TcpListener; // Type alias for our engine. For this example, we are using Handlebars type AppEngine = Engine>; #[derive(Debug, Serialize)] pub struct Person { name: String, } async fn get_name( // Obtain the engine engine: AppEngine, // Extract the key Key(key): Key, Path(name): Path, ) -> impl IntoResponse { let person = Person { name }; RenderHtml(key, engine, person) } // Define your application shared state #[derive(Clone, FromRef)] struct AppState { engine: AppEngine, } #[tokio::main] async fn main() { // Set up the Handlebars engine with the same route paths as the Axum router let mut hbs = Handlebars::new(); hbs.register_template_string("/:name", "

Hello HandleBars!

{{name}}

") .unwrap(); let app = Router::new() .route("/:name", get(get_name)) // Create the application state .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(); }