use chrono::{DateTime, Utc}; use serde::Deserialize; use crate::Result; use crate::{article::Article, posts::Post}; static DIRECTORY: &str = "./poetry"; pub struct Poem { file_name: String, title: Option, created_at: DateTime, published_at: DateTime, updated_at: Option>, content: String, // TODO: localisation (get lang from file names) lang: String, } #[derive(Deserialize)] pub struct PoemMetadata { title: Option, created_at: String, published_at: String, updated_at: Option, } impl Article for Poem { type Article = Poem; type Metadata = PoemMetadata; fn directory() -> &'static str { DIRECTORY } fn new(file_name: String, metadata: Self::Metadata, content: String) -> Result { let updated_at = if let Some(updated_at) = metadata.updated_at { Some(updated_at.parse::>()?) } else { None }; Ok(Poem { file_name, title: metadata.title, created_at: metadata.created_at.parse::>()?, published_at: metadata.published_at.parse::>()?, updated_at, content, lang: "en".to_string(), }) } } impl Post for Poem { fn id(&self) -> &str { &self.file_name } fn subject(&self) -> Option<&str> { self.title.as_deref() } fn published_at(&self) -> &DateTime { &self.published_at } fn updated_at(&self) -> Option<&DateTime> { self.updated_at.as_ref() } fn tags(&self) -> Vec<&str> { vec!["poetry"] } fn lang(&self) -> &str { "en" } fn post_type(&self) -> crate::posts::PostType { todo!() } fn content(&self) -> &str { todo!() } }