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>, } #[derive(Content)] struct Post { title: String, url: String, file: File, } #[once(time = 60)] pub fn get_index(config: Config) -> String { config.tmpl.render( "blog/index.html", BlogIndexTemplate { posts: None }, Infos { page_title: Some("Blog".to_string()), page_desc: Some("Liste des posts d'Anri".to_string()), page_kw: Some(["blog", "blogging"].join(", ")), }, ) } #[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(", ")), } }