cyndikator 0.1.0

A cli rss reader
use super::FetcherFormat;
use cyndikator_atom::Feed;
use cyndikator_dispatch::Event;
use std::str::FromStr;
use url::Url;

pub struct Format;

impl FetcherFormat for Format {
    fn title(&self, content: &str) -> eyre::Result<String> {
        let feed = Feed::from_str(content)?;
        Ok(feed.title.content)
    }

    fn events(&self, url: &Url, content: &str) -> eyre::Result<Vec<Event>> {
        let feed = Feed::from_str(content)?;

        let mut results = Vec::with_capacity(feed.entries.len());

        for entry in feed.entries {
            let feed_url = url.to_string();
            let feed_title = Some(feed.title.content.clone());
            let feed_categories = feed.categories.iter().map(|c| c.term.clone()).collect();

            let url = entry
                .links
                .iter()
                .find(|l| l.ty.as_deref() == Some("text/html"))
                .or_else(|| entry.links.iter().find(|l| l.ty == None))
                .map(|l| l.href.clone());
            let title = Some(entry.title.content);
            let description = entry.summary.map(|t| t.content.clone());
            let categories = entry.categories.iter().map(|c| c.term.clone()).collect();
            let date = Some(entry.updated.into());

            results.push(Event {
                url,
                title,
                categories,
                description,

                feed_url,
                feed_title,
                feed_categories,

                date,
            });
        }

        Ok(results)
    }
}