mod dir;
mod lines;
mod warc;
pub use dir::DirOut;
pub use lines::LinesOut;
pub use warc::WarcOut;
use pagesift_api::types::Document;
pub trait PageOut: Send + Sync {
fn page(&self, doc: &Document) -> std::io::Result<()>;
fn finish(&self) -> std::io::Result<()> {
Ok(())
}
}
#[derive(Default)]
pub struct Fanout(pub Vec<Box<dyn PageOut>>);
impl PageOut for Fanout {
fn page(&self, doc: &Document) -> std::io::Result<()> {
each(&self.0, |o| o.page(doc))
}
fn finish(&self) -> std::io::Result<()> {
each(&self.0, |o| o.finish())
}
}
fn each(
outs: &[Box<dyn PageOut>],
f: impl Fn(&dyn PageOut) -> std::io::Result<()>,
) -> std::io::Result<()> {
let mut first = Ok(());
for o in outs {
if let Err(e) = f(o.as_ref()) {
first = first.and(Err(e));
}
}
first
}
pub fn page_url(doc: &Document) -> String {
doc.metadata
.source_url
.clone()
.or_else(|| doc.metadata.url.clone())
.unwrap_or_default()
}