use crate::{Detection, Events, FormatId, Line, Result, Source};
pub trait DocumentReader: Send + Sync {
fn id(&self) -> FormatId;
fn read<'a>(&self, src: &'a Source, ctx: &ReadContext) -> Result<Events<'a>>;
fn capabilities(&self) -> ReaderCaps {
ReaderCaps::default()
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct ReaderCaps {
pub streaming: bool,
pub paginated: bool,
pub metadata: bool,
}
#[derive(Clone, Debug, Default)]
pub struct ReadContext {
pub page_range: Option<(u32, u32)>,
pub encoding: Option<String>,
pub metadata_only: bool,
}
pub trait Detector: Send + Sync {
fn sniff(&self, src: &Source) -> Option<Detection>;
}
pub trait Transform: Send + Sync {
fn apply<'a>(&self, events: Events<'a>) -> Events<'a>;
}
pub trait Backend {
fn caps(&self) -> BackendCaps;
fn begin(&mut self, out: &mut dyn std::io::Write) -> Result<()> {
let _ = out;
Ok(())
}
fn write_line(&mut self, line: &Line<'_>, out: &mut dyn std::io::Write) -> Result<()>;
fn finish(&mut self, out: &mut dyn std::io::Write) -> Result<()> {
let _ = out;
Ok(())
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct BackendCaps {
pub styled: bool,
pub hyperlinks: bool,
pub graphics: bool,
}