diff options
Diffstat (limited to 'src/handlers/blog.rs')
| -rw-r--r-- | src/handlers/blog.rs | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/src/handlers/blog.rs b/src/handlers/blog.rs index 007b8e0..f6aae06 100644 --- a/src/handlers/blog.rs +++ b/src/handlers/blog.rs @@ -1,14 +1,13 @@ -use super::{PostNotFound, SeriesNotFound, LAST_MODIFIED}; -use crate::{ - app::State, - post::Post, - templates::{self, Html, RenderRucte}, +use super::Result; +use crate::{app::State, post::Post, templates}; +use axum::{ + extract::{Extension, Path}, + response::Html, }; use lazy_static::lazy_static; use prometheus::{opts, register_int_counter_vec, IntCounterVec}; use std::sync::Arc; use tracing::{error, instrument}; -use warp::{http::Response, Rejection, Reply}; lazy_static! { static ref HIT_COUNTER: IntCounterVec = register_int_counter_vec!( @@ -19,17 +18,18 @@ lazy_static! { } #[instrument(skip(state))] -pub async fn index(state: Arc<State>) -> Result<impl Reply, Rejection> { +pub async fn index(Extension(state): Extension<Arc<State>>) -> Result { let state = state.clone(); - Response::builder() - .header("Last-Modified", &*LAST_MODIFIED) - .html(|o| templates::blogindex_html(o, state.blog.clone())) + let mut result: Vec<u8> = vec![]; + templates::blogindex_html(&mut result, state.blog.clone())?; + Ok(Html(result)) } #[instrument(skip(state))] -pub async fn series(state: Arc<State>) -> Result<impl Reply, Rejection> { +pub async fn series(Extension(state): Extension<Arc<State>>) -> Result { let state = state.clone(); let mut series: Vec<String> = vec![]; + let mut result: Vec<u8> = vec![]; for post in &state.blog { if post.front_matter.series.is_some() { @@ -40,15 +40,18 @@ pub async fn series(state: Arc<State>) -> Result<impl Reply, Rejection> { series.sort(); series.dedup(); - Response::builder() - .header("Last-Modified", &*LAST_MODIFIED) - .html(|o| templates::series_html(o, series)) + templates::series_html(&mut result, series)?; + Ok(Html(result)) } #[instrument(skip(state))] -pub async fn series_view(series: String, state: Arc<State>) -> Result<impl Reply, Rejection> { +pub async fn series_view( + Path(series): Path<String>, + Extension(state): Extension<Arc<State>>, +) -> Result { let state = state.clone(); let mut posts: Vec<Post> = vec![]; + let mut result: Vec<u8> = vec![]; for post in &state.blog { if post.front_matter.series.is_none() { @@ -62,16 +65,18 @@ pub async fn series_view(series: String, state: Arc<State>) -> Result<impl Reply if posts.len() == 0 { error!("series not found"); - Err(SeriesNotFound(series).into()) - } else { - Response::builder() - .header("Last-Modified", &*LAST_MODIFIED) - .html(|o| templates::series_posts_html(o, series, &posts)) + return Err(super::Error::SeriesNotFound(series)); } + + templates::series_posts_html(&mut result, series, &posts).unwrap(); + Ok(Html(result)) } #[instrument(skip(state))] -pub async fn post_view(name: String, state: Arc<State>) -> Result<impl Reply, Rejection> { +pub async fn post_view( + Path(name): Path<String>, + Extension(state): Extension<Arc<State>>, +) -> Result { let mut want: Option<Post> = None; for post in &state.blog { @@ -81,15 +86,15 @@ pub async fn post_view(name: String, state: Arc<State>) -> Result<impl Reply, Re } match want { - None => Err(PostNotFound("blog".into(), name).into()), + None => Err(super::Error::PostNotFound(name)), Some(post) => { HIT_COUNTER .with_label_values(&[name.clone().as_str()]) .inc(); - let body = Html(post.body_html.clone()); - Response::builder() - .header("Last-Modified", &*LAST_MODIFIED) - .html(|o| templates::blogpost_html(o, post, body)) + let body = templates::Html(post.body_html.clone()); + let mut result: Vec<u8> = vec![]; + templates::blogpost_html(&mut result, post, body)?; + Ok(Html(result)) } } } |
