use std::{io::copy, io::prelude::*};
use anyhow::Error;
use log::info;
use rmp_serde::Serializer;
use serde::Serialize;
use crate::store::base::Store;
const CACHE_VERSION: &[u8] = b"askalono-04";
impl Store {
pub fn from_cache<R>(mut readable: R) -> Result<Store, Error>
where
R: Read + Sized,
{
let mut header = [0u8; 11];
readable.read_exact(&mut header)?;
if header != CACHE_VERSION {
anyhow::bail!(
"cache version mismatch; expected '{}', found '{}'",
String::from_utf8_lossy(CACHE_VERSION),
String::from_utf8_lossy(&header)
);
}
#[cfg(not(feature = "gzip"))]
let dec = zstd::Decoder::new(readable)?;
#[cfg(feature = "gzip")]
let dec = flate2::read::GzDecoder::new(readable);
let store = rmp_serde::decode::from_read(dec)?;
Ok(store)
}
pub fn to_cache<W>(&self, mut writable: W) -> Result<(), Error>
where
W: Write + Sized,
{
let buf = {
let mut buf = Vec::with_capacity(4 * 1024 * 1024);
let mut serializer = Serializer::new(&mut buf);
self.serialize(&mut serializer)?;
buf
};
info!("Pre-compressed output is {} bytes", buf.len());
writable.write_all(CACHE_VERSION)?;
#[cfg(not(feature = "gzip"))]
let mut enc = zstd::Encoder::new(writable, 21)?;
#[cfg(feature = "gzip")]
let mut enc = flate2::write::GzEncoder::new(writable, flate2::Compression::default());
copy(&mut buf.as_slice(), &mut enc)?;
enc.finish()?;
Ok(())
}
}