use crate::Message; use atom_syndication::{ ContentBuilder, Entry, EntryBuilder, Feed, FeedBuilder, Generator, LinkBuilder, Person, }; use chrono::{DateTime, Utc, TimeZone}; use mail_parser::HeaderValue; pub(crate) fn add_entry_to_feed(feed: &mut Feed, message: &Message, processed_html: &String) { let parsed = message.get_parsed().unwrap(); let date = parsed.get_date().expect("Could not extract date"); let from = match parsed.get_from() { HeaderValue::Address(e) => e, _ => return, }; let path = crate::get_path(&parsed, message); let url = format!("https://newsletters.kiers.eu/{}", &path); let mut entry: Entry = Newsletter { author: Person { name: match &from.name { Some(n) => n.to_string(), _ => match &from.address { Some(e) => e.to_string(), _ => "".to_string(), }, }, email: match &from.address { Some(e) => Some(e.to_string()), _ => None, }, uri: None, }, title: parsed .get_subject() .expect("Expected a subject") .to_string(), content: Some(processed_html.clone()), id: url.clone(), published: Utc.timestamp(date.to_timestamp(), 0), //(format!("{}{}", &date.to_iso8601(), "+00:00").as_str()).`unwrap(), url: url, } .into(); entry.set_updated(Utc.timestamp(date.to_timestamp(), 0)); feed.entries.push(entry); } pub(crate) fn build_atom_feed() -> Feed { FeedBuilder::default() .title("JJKiers Newsletters") .id("https://newsletters.kiers.eu/feed.atom") .link( LinkBuilder::default() .href("https://newsletters.kiers.eu/") .rel("alternate") .build(), ) .link( LinkBuilder::default() .href("https://newsletters.kiers.eu/feed.atom") .rel("self") .build(), ) .generator(Generator { value: String::from("newsletter-to-web"), uri: None, version: Some(String::from("0.0.1")), }) .build() } //#[derive(Serialize, Deserialize, Debug)] pub(crate) struct Newsletter { id: String, url: String, title: String, content: Option, author: Person, published: DateTime, } impl From for Entry { fn from(post: Newsletter) -> Self { let content = post.content.map(|v| { ContentBuilder::default() .value(v) .content_type(Some("html".to_string())) .build() }); EntryBuilder::default() .title(post.title) .id(post.id) .published(Some(post.published.clone().into())) .author(post.author.into()) .content(content) .link( LinkBuilder::default() .href(post.url) .rel("alternate") .build(), ) .build() } }