use std::{
borrow::Cow,
fs::File,
io::{Seek, Write},
path::PathBuf,
sync::Arc,
};
use serde::{Deserialize, Serialize};
use crate::{
output::{Item, drivers::Driver, page::PageSetup},
spv::Writer,
};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SpvConfig {
pub file: PathBuf,
pub page_setup: Option<PageSetup>,
}
pub struct SpvDriver<W>
where
W: Write + Seek,
{
writer: Writer<W>,
}
impl<W> Driver for SpvDriver<W>
where
W: Write + Seek + 'static,
{
fn name(&self) -> Cow<'static, str> {
Cow::from("spv")
}
fn write(&mut self, item: &Arc<Item>) {
self.writer.write(item).unwrap();
}
fn setup(&mut self, page_setup: &PageSetup) -> bool {
self.writer.set_page_setup(page_setup.clone());
true
}
fn handles_show(&self) -> bool {
true
}
fn handles_groups(&self) -> bool {
true
}
}
impl SpvDriver<File> {
pub fn new(config: &SpvConfig) -> std::io::Result<Self> {
let mut writer = Writer::for_writer(File::create(&config.file)?).unwrap();
if let Some(page_setup) = &config.page_setup {
writer = writer.with_page_setup(page_setup.clone());
}
Ok(Self { writer })
}
}
impl<W> SpvDriver<W>
where
W: Write + Seek,
{
pub fn for_writer(writer: W) -> Self {
Self {
writer: Writer::for_writer(writer).unwrap(),
}
}
}