diff options
Diffstat (limited to '')
-rw-r--r-- | src/posts.rs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/posts.rs b/src/posts.rs new file mode 100644 index 0000000..415f743 --- /dev/null +++ b/src/posts.rs @@ -0,0 +1,62 @@ +use std::collections::HashSet; + +use chrono::{DateTime, Utc}; +use serde::Serialize; + +#[derive(Serialize, Debug)] +pub enum PostType { + Article, + Note, +} + +pub trait Post { + fn id(&self) -> &str; + fn subject(&self) -> Option<&str>; + fn published_at(&self) -> &DateTime<Utc>; + fn updated_at(&self) -> &DateTime<Utc>; + fn tags(&self) -> &Vec<String>; + fn lang(&self) -> &str; + fn post_type(&self) -> PostType; + fn content(&self) -> &str; + + fn link(&self) -> String { + "https://en.blos.sm/posts/".to_owned() + self.id() + } + + fn get_tags<'a>(posts: &'a Vec<Self>) -> Vec<&'a String> + where + Self: Sized, + { + let mut tags = posts + .into_iter() + .fold(HashSet::new(), |mut acc, post| { + let tags = post.tags(); + for tag in tags { + acc.insert(tag); + } + acc + }) + .into_iter() + .collect::<Vec<_>>(); + tags.sort(); + tags + } + + fn filter_by_tags(posts: Vec<Self>, filter_tags: &HashSet<String>) -> Vec<Self> + where + Self: Sized, + { + posts + .into_iter() + .filter(|post| { + for tag in post.tags() { + match filter_tags.contains(tag) { + true => return true, + false => continue, + } + } + false + }) + .collect() + } +} |