use actix_web::{get, web, HttpResponse, Responder}; use cached::proc_macro::once; use ramhorns::Content; use crate::{ config::Config, template::{read_md_file, File, Infos}, }; #[get("/blog")] pub async fn index(config: web::Data) -> impl Responder { HttpResponse::Ok().body(get_index(config.get_ref().clone())) } #[derive(Content)] struct BlogIndexTemplate { posts: Option>, } #[once(time = 60)] pub fn get_index(config: Config) -> String { config.tmpl.render( "blog/index.html", BlogIndexTemplate { posts: None }, Infos { page_title: None, page_desc: None, page_kw: None, }, ) } #[derive(Content)] struct BlogPostTemplate { post: Option, } #[get("/blog/{id}")] pub async fn page(path: web::Path<(String,)>, config: web::Data) -> impl Responder { HttpResponse::Ok().body(get_post(path.into_inner().0, config.get_ref().clone())) } pub fn get_post(file: String, config: Config) -> String { let mut post = None; let infos = _get_post(&mut post, file); config .tmpl .render("blog/post.html", BlogPostTemplate { post }, infos) } fn _get_post(post: &mut Option, filename: String) -> Infos { let blog_dir = "data/blog"; let ext = ".md"; *post = read_md_file(&format!("{blog_dir}/{filename}{ext}")); let title = match post { Some(data) => match &data.metadata.info.title { Some(text) => text, None => &filename, }, None => &filename, }; Infos { page_title: Some(format!("Post: {}", title)), page_desc: Some("Blog d'Anri".to_string()), page_kw: Some(["blog", "blogging", "write", "writing"].join(", ")), } }