use std::{borrow::Cow, fs::File, io::BufWriter, path::PathBuf, sync::Arc};
use serde::{Deserialize, Serialize};
use crate::{
data::{ByteString, Case, Datum},
dictionary::Dictionary,
sys::{WriteOptions, Writer, raw::records::Compression},
};
use super::{CaseWriter, Driver, Item};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SavConfig {
file: PathBuf,
compression: Option<Compression>,
}
pub struct SavDriver {
file: PathBuf,
compression: Option<Compression>,
}
impl SavDriver {
pub fn new(config: &SavConfig) -> std::io::Result<Self> {
Ok(Self {
file: config.file.clone(),
compression: config.compression,
})
}
}
impl Driver for SavDriver {
fn name(&self) -> Cow<'static, str> {
Cow::from("sav")
}
fn write(&mut self, _item: &Arc<Item>) {
todo!()
}
fn can_write_data_file(&self) -> bool {
true
}
fn write_data_file<'a>(
&'a mut self,
dictionary: &'a Dictionary,
) -> anyhow::Result<Option<Box<dyn CaseWriter + 'a>>> {
Ok(Some(Box::new(SavDriverCaseWriter {
writer: WriteOptions::new()
.with_compression(self.compression)
.write_file(&dictionary, &self.file)?,
})))
}
}
struct SavDriverCaseWriter {
writer: Writer<BufWriter<File>>,
}
impl CaseWriter for SavDriverCaseWriter {
fn write_case(&mut self, case: Case<Vec<Datum<ByteString>>>) -> anyhow::Result<()> {
self.writer.write_case(case)?;
Ok(())
}
}