2024-05-14 15:33:49 -05:00
|
|
|
use crate::{file_watcher::FileWatcher, prelude::*, state::State as AppState, static_files};
|
2024-05-14 14:30:03 -05:00
|
|
|
use axum::{extract::State, response::Html, routing::get, Router};
|
|
|
|
use minijinja::context;
|
|
|
|
use tower_livereload::LiveReloadLayer;
|
|
|
|
|
2024-05-14 15:33:49 -05:00
|
|
|
pub async fn router(with_watchers: bool) -> Result<(Router, Vec<Option<FileWatcher>>)> {
|
2024-05-14 14:30:03 -05:00
|
|
|
let state = AppState::try_new().await?;
|
|
|
|
|
2024-05-14 15:33:49 -05:00
|
|
|
let live_reload_layer: Option<LiveReloadLayer> = if with_watchers {
|
|
|
|
Some(LiveReloadLayer::new())
|
|
|
|
} else {
|
|
|
|
None
|
|
|
|
};
|
2024-05-14 14:30:03 -05:00
|
|
|
|
2024-05-14 15:33:49 -05:00
|
|
|
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()
|
2024-05-14 14:30:03 -05:00
|
|
|
.route("/", get(index))
|
|
|
|
.nest_service("/static", static_file_service)
|
2024-05-14 15:33:49 -05:00
|
|
|
.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))
|
2024-05-14 14:30:03 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
async fn index(State(state): State<AppState>) -> Result<Html<String>> {
|
|
|
|
Ok(Html(
|
|
|
|
state
|
|
|
|
.templates
|
|
|
|
.render("pages/index.html.jinja", context!())
|
|
|
|
.await?,
|
|
|
|
))
|
|
|
|
}
|