aboutsummaryrefslogtreecommitdiffstats
path: root/src/poetry.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/poetry.rs')
-rw-r--r--src/poetry.rs45
1 files changed, 42 insertions, 3 deletions
diff --git a/src/poetry.rs b/src/poetry.rs
index f5f194c..6429bd3 100644
--- a/src/poetry.rs
+++ b/src/poetry.rs
@@ -1,6 +1,10 @@
use chrono::{DateTime, Utc};
+use serde::Deserialize;
-use crate::posts::Post;
+use crate::Result;
+use crate::{article::Article, posts::Post};
+
+static DIRECTORY: &str = "./poetry";
pub struct Poem {
file_name: String,
@@ -13,6 +17,41 @@ pub struct Poem {
lang: String,
}
+#[derive(Deserialize)]
+pub struct PoemMetadata {
+ title: Option<String>,
+ created_at: String,
+ published_at: String,
+ updated_at: Option<String>,
+}
+
+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<Self::Article> {
+ let updated_at = if let Some(updated_at) = metadata.updated_at {
+ Some(updated_at.parse::<DateTime<Utc>>()?)
+ } else {
+ None
+ };
+ Ok(Poem {
+ file_name,
+ title: metadata.title,
+ created_at: metadata.created_at.parse::<DateTime<Utc>>()?,
+ published_at: metadata.published_at.parse::<DateTime<Utc>>()?,
+ updated_at,
+ content,
+ lang: "en".to_string(),
+ })
+ }
+}
+
impl Post for Poem {
fn id(&self) -> &str {
&self.file_name
@@ -30,8 +69,8 @@ impl Post for Poem {
self.updated_at.as_ref()
}
- fn tags(&self) -> &Vec<String> {
- todo!()
+ fn tags(&self) -> Vec<&str> {
+ vec!["poetry"]
}
fn lang(&self) -> &str {