use rss::Channel;
use crate::entry::Entry;
use crate::error::transform::{NothingToTransformError, RssError};
use crate::sink::Message;
#[derive(Debug)]
pub struct Rss;
impl Rss {
#[tracing::instrument(skip_all)]
pub fn transform(&self, entry: &Entry) -> Result<Vec<Entry>, RssError> {
tracing::debug!("Parsing RSS articles");
let feed = Channel::read_from(
entry
.raw_contents
.as_ref()
.ok_or(NothingToTransformError)?
.as_bytes(),
)?;
tracing::debug!("Got {num} RSS articles total", num = feed.items.len());
let entries = feed
.items
.into_iter()
.map(|x| {
let id = Some(x.guid.as_ref().unwrap().value.clone());
let title = Some(x.title.unwrap());
let body = Some(x.description.unwrap());
let link = Some(x.link.unwrap().as_str().try_into().unwrap());
Entry {
id,
raw_contents: body.clone(),
msg: Message {
title,
body,
link,
..Default::default()
},
}
})
.collect::<Vec<_>>();
Ok(entries)
}
}