From fb201f9d5d28fff18a766e1ad718024c02b3681f Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Fri, 9 Aug 2024 12:55:20 +0200 Subject: [PATCH] refacto: extract livereload layer setup into a function Co-authored-by: kosssi --- crates/app/src/main.rs | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 961e99b..bf3cea0 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -1,16 +1,22 @@ use ::app::get_router; +use axum::body::Body; use axum::http::Request; use listenfd::ListenFd; use notify::Watcher; use std::env; use std::path::Path; use tokio::net::TcpListener; +use tower_livereload::predicate::Predicate; use tower_livereload::LiveReloadLayer; /// Nous filtrons les requêtes de `htmx` pour ne pas inclure le script _JS_ qui gère le rechargement /// Voir https://github.com/leotaku/tower-livereload/pull/3 -fn not_htmx_predicate(req: &Request) -> bool { - !req.headers().contains_key("hx-request") +#[derive(Copy, Clone)] +struct NotHtmxPredicate; +impl Predicate> for NotHtmxPredicate { + fn check(&mut self, req: &Request) -> bool { + !(req.headers().contains_key("hx-request")) + } } const DEFAULT_LISTENER: &str = "localhost:3000"; @@ -28,22 +34,24 @@ async fn get_tcp_listener() -> TcpListener { } } +fn get_livereload_layer(templates_path: &Path) -> LiveReloadLayer { + let livereload = LiveReloadLayer::new(); + let reloader = livereload.reloader(); + let mut watcher = notify::recommended_watcher(move |_| reloader.reload()).unwrap(); + watcher + .watch(templates_path, notify::RecursiveMode::Recursive) + .unwrap(); + livereload.request_predicate::(NotHtmxPredicate) +} + #[tokio::main] async fn main() { let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); let assets_path = Path::new(&manifest_dir).join("assets"); let templates_path = Path::new(&manifest_dir).join("templates"); - // Setup the livereload - let livereload = LiveReloadLayer::new(); - let reloader = livereload.reloader(); - let mut watcher = notify::recommended_watcher(move |_| reloader.reload()).unwrap(); - watcher - .watch(&templates_path, notify::RecursiveMode::Recursive) - .unwrap(); - - let router = - get_router(assets_path.as_path()).layer(livereload.request_predicate(not_htmx_predicate)); + let livereload_layer = get_livereload_layer(&templates_path); + let router = get_router(assets_path.as_path()).layer(livereload_layer); let listener: TcpListener = get_tcp_listener().await; println!("Listening on: http://{}", listener.local_addr().unwrap());