summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs56
1 files changed, 43 insertions, 13 deletions
diff --git a/src/main.rs b/src/main.rs
index cbabc10..5359661 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,9 +1,7 @@
use handlebars::Handlebars;
use serde::Serialize;
-use serde_json::json;
use std::sync::Arc;
-use std::time::SystemTime;
-use warp::{Filter, Rejection};
+use warp::{http::Uri, Filter, Rejection};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
@@ -11,10 +9,14 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut hbs = Handlebars::new();
hbs.register_template_file("base", "templates/base.hbs")?;
hbs.register_template_file("index", "templates/index.hbs")?;
+ hbs.register_template_file("policies", "templates/policies.hbs")?;
+ hbs.register_template_file("about", "templates/about.hbs")?;
let hbs = Arc::new(hbs);
// Build routes
let routes = index_filter(hbs.clone())
+ .or(template_filter(hbs.clone()))
+ .or(redirect_static_ext())
.or(evals_list())
.or(warp::fs::dir("static"));
@@ -30,7 +32,44 @@ fn index_filter(
) -> impl Filter<Extract = (impl warp::Reply,), Error = Rejection> + Clone {
warp::get()
.and(warp::path::end())
- .map(move || render("index", hbs.clone(), json!({"year", year().unwrap()})))
+ .map(move || render("index", hbs.clone(), ""))
+}
+
+fn template_filter(
+ hbs: Arc<Handlebars<'static>>,
+) -> impl Filter<Extract = (impl warp::Reply,), Error = Rejection> + Clone {
+ warp::path!(String).and_then(move |name: String| {
+ let hbs = hbs.clone();
+ async move {
+ if hbs.has_template(&name) {
+ Ok(render(&name, hbs, ""))
+ } else {
+ Err(warp::reject::not_found())
+ }
+ }
+ })
+}
+
+fn redirect_static_ext() -> impl Filter<Extract = (impl warp::Reply,), Error = Rejection> + Clone {
+ warp::path!(String).and_then(move |path: String| async move {
+ if let Some(prefix) = path.strip_suffix(".php") {
+ return Ok(warp::redirect(
+ prefix
+ .parse::<Uri>()
+ .unwrap_or_else(|_| Uri::from_static("/")),
+ ));
+ }
+
+ if let Some(prefix) = path.strip_suffix(".html") {
+ return Ok(warp::redirect(
+ prefix
+ .parse::<Uri>()
+ .unwrap_or_else(|_| Uri::from_static("/")),
+ ));
+ }
+
+ Err(warp::reject::not_found())
+ })
}
fn evals_list() -> impl Filter<Extract = (&'static str,), Error = Rejection> + Clone {
@@ -49,12 +88,3 @@ where
.unwrap_or_else(|err| err.to_string());
warp::reply::html(render)
}
-
-const UNIX_YEAR: u64 = 31556926;
-
-fn year() -> Result<u64, Box<dyn std::error::Error>> {
- let date = SystemTime::now()
- .duration_since(SystemTime::UNIX_EPOCH)?
- .as_secs();
- Ok(date / UNIX_YEAR)
-}