use crate::{file_watcher::FileWatcher, prelude::*, state::State as AppState, static_files}; use axum::{extract::State, response::Html, routing::get, Router}; use minijinja::context; use tower_livereload::LiveReloadLayer; pub async fn router(with_watchers: bool) -> Result<(Router, Vec>)> { let state = AppState::try_new().await?; let live_reload_layer: Option = if with_watchers { Some(LiveReloadLayer::new()) } else { None }; let orl = || { if let Some(lr) = &live_reload_layer { Some(lr.reloader()) } else { None } }; let template_file_watcher = state.clone().templates.start_watcher(orl()).await?; let (static_file_service, static_file_watcher) = static_files::router(orl())?; let mut result = Router::new() .route("/", get(index)) .nest_service("/static", static_file_service) .with_state(state.clone()); if let Some(lr) = live_reload_layer { result = result.clone().layer(lr); } let watchers = vec![template_file_watcher, static_file_watcher]; Ok((result, watchers)) } async fn index(State(state): State) -> Result> { Ok(Html( state .templates .render("pages/index.html.jinja", context!()) .await?, )) }