From 13fb55de9a7a5c7b066b2d7166fdc74c2caa96fa Mon Sep 17 00:00:00 2001 From: imbolc Date: Sun, 16 Jun 2024 12:43:14 +0600 Subject: [PATCH] Example --- examples/auto-vary.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 examples/auto-vary.rs diff --git a/examples/auto-vary.rs b/examples/auto-vary.rs new file mode 100644 index 0000000..b7868d5 --- /dev/null +++ b/examples/auto-vary.rs @@ -0,0 +1,40 @@ +//! Using `auto-vary` middleware +//! +//! Don't forget about the feature while running it: +//! `cargo run --features auto-vary --example auto-vary` +use std::time::Duration; + +use axum::{response::Html, routing::get, serve, Router}; +use axum_htmx::{AutoVaryLayer, HxRequest}; +use tokio::{net::TcpListener, time::sleep}; + +#[tokio::main] +async fn main() { + let app = Router::new() + .route("/", get(handler)) + // Add the middleware + .layer(AutoVaryLayer); + + let listener = TcpListener::bind("0.0.0.0:3000").await.unwrap(); + serve(listener, app).await.unwrap(); +} + +// Our handler differentiates full-page GET requests from HTMx-based ones by looking at the `hx-request` +// requestheader. +// +// The middleware sees the usage of the `HxRequest` extractor and automatically adds the +// `Vary: hx-request` response header. +async fn handler(HxRequest(hx_request): HxRequest) -> Html<&'static str> { + if hx_request { + // For HTMx-based GET request, it returns a partial page update + sleep(Duration::from_secs(3)).await; + return Html("HTMx response"); + } + // While for a normal GET request, it returns the whole page + Html( + r#" + +

Loading ...

+ "#, + ) +}