-
-
Notifications
You must be signed in to change notification settings - Fork 8
/
routes.rs
72 lines (61 loc) · 2.05 KB
/
routes.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
use std::sync::Arc;
use axum::{
extract::{rejection::PathRejection, Path, State},
http::StatusCode,
response::{Html, IntoResponse, Redirect},
};
use minijinja::{context, Environment};
use percent_encoding::utf8_percent_encode;
use serde::Serialize;
use crate::{turbofish::TurboFish, FRAGMENT};
pub async fn index(env: State<Arc<Environment<'static>>>) -> impl IntoResponse {
render_html_template(&env, "index", ())
}
pub async fn about(env: State<Arc<Environment<'static>>>) -> impl IntoResponse {
render_html_template(&env, "about", ())
}
pub async fn random() -> impl IntoResponse {
Redirect::to(&format!("/{}", TurboFish::random().to_uri_segment()))
}
pub async fn random_reverse() -> impl IntoResponse {
Redirect::to(&format!("/{}", TurboFish::random_reverse().to_uri_segment()))
}
pub async fn turbofish(
env: State<Arc<Environment<'static>>>,
path: Result<Path<TurboFish>, PathRejection>,
) -> impl IntoResponse {
match path {
Ok(Path(turbofish)) => Ok(render_html_template(
&env,
"turbofish",
context! {
guts => turbofish.guts.replace('<', "<\u{200B}"),
guts_link => utf8_percent_encode(&turbofish.guts, FRAGMENT).to_string(),
reverse => turbofish.reverse,
},
)),
Err(_) => Err(page_not_found(env).await),
}
}
pub async fn page_not_found(env: State<Arc<Environment<'static>>>) -> impl IntoResponse {
render_html_template(&env, "404", ()).map(|ok| (StatusCode::NOT_FOUND, ok))
}
fn render_html_template<S>(
env: &Environment<'_>,
name: &str,
ctx: S,
) -> Result<Html<String>, impl IntoResponse>
where
S: Serialize,
{
let Ok(template) = env.get_template(name) else {
return Err((
StatusCode::INTERNAL_SERVER_ERROR,
"Couldn't find MiniJinja template".to_owned(),
));
};
let rendered = template.render(ctx).map_err(|e| {
(StatusCode::INTERNAL_SERVER_ERROR, format!("Failed to render MiniJinja template: {e}"))
})?;
Ok(Html(rendered))
}