use chrono::NaiveDate; use regex::Regex; use rust_embed::RustEmbed; use sailfish::TemplateOnce; use std::cmp::{Eq, Ord, PartialEq, PartialOrd}; use std::str; pub const BLOG_REGEX: &str = r"(?P[\d]{4}-[\d]{2}-[\d]{2})(?P[a-zA-Z0-9-_]*)"; #[derive(RustEmbed)] #[folder = "content/posts/"] pub struct PostAsset; #[derive(TemplateOnce)] #[template(path = "index.html")] pub struct IndexTemplate { pub posts: Vec<BlogEntry>, } #[derive(TemplateOnce)] #[template(path = "post.html")] pub struct PostTemplate { pub content: String, pub title: String, pub date: String, } #[derive(PartialEq, Eq, PartialOrd, Ord)] pub struct BlogEntry { pub title: String, pub datetime: NaiveDate, pub file: String, } impl BlogEntry { pub fn new(path: &String) -> BlogEntry { let re = Regex::new(BLOG_REGEX).unwrap(); let caps = re.captures(path).unwrap(); let date = &caps["date"]; let title = str::replace(&caps["title"], "_", " "); BlogEntry { title: String::from(title), file: String::from(path), datetime: NaiveDate::parse_from_str(date, "%Y-%m-%d").unwrap(), } } }