use ::app::get_router; use axum::http::Request; use listenfd::ListenFd; use notify::Watcher; use std::env; use std::path::Path; use tokio::net::TcpListener; 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") } #[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"); let livereload = LiveReloadLayer::new(); let reloader = livereload.reloader(); let router = get_router(assets_path.as_path()).layer(livereload.request_predicate(not_htmx_predicate)); let mut watcher = notify::recommended_watcher(move |_| reloader.reload()).unwrap(); watcher .watch(&templates_path, notify::RecursiveMode::Recursive) .unwrap(); let mut listenfd = ListenFd::from_env(); let listener = match listenfd.take_tcp_listener(0).unwrap() { // if we are given a tcp listener on listen fd 0, we use that one Some(listener) => { listener.set_nonblocking(true).unwrap(); TcpListener::from_std(listener).unwrap() } // otherwise fall back to local listening None => TcpListener::bind("localhost:3000").await.unwrap(), }; println!("Listening on: http://{}", listener.local_addr().unwrap()); // Run the server with the router axum::serve(listener, router.into_make_service()) .await .unwrap(); }