comde/
snappy.rs

1use std::io::{prelude::*, Result, Seek, SeekFrom};
2
3use crate::{com::ByteCount, Compressor, Decompress, Decompressor};
4
5#[derive(Debug, Copy, Clone)]
6pub struct SnappyDecompressor;
7
8impl Decompressor for SnappyDecompressor {
9    fn new() -> Self {
10        SnappyDecompressor
11    }
12
13    fn copy<R: Read, W: Write>(&self, source: R, mut dest: W) -> Result<u64> {
14        let mut decoder = snap::read::FrameDecoder::new(source);
15        std::io::copy(&mut decoder, &mut dest)
16    }
17
18    fn from_reader<R: Read, V: Decompress>(&self, reader: R) -> Result<V>
19    where
20        Self: Sized,
21    {
22        let decoder = snap::read::FrameDecoder::new(reader);
23        V::from_reader(decoder)
24    }
25}
26
27#[derive(Debug, Copy, Clone)]
28pub struct SnappyCompressor;
29
30impl Compressor for SnappyCompressor {
31    fn new() -> Self {
32        SnappyCompressor
33    }
34
35    fn compress<W: Write + Seek, R: Read>(
36        &self,
37        writer: &mut W,
38        reader: &mut R,
39    ) -> Result<ByteCount> {
40        let start = writer.seek(SeekFrom::Current(0))?;
41        let mut encoder = snap::write::FrameEncoder::new(writer);
42        let read = std::io::copy(reader, &mut encoder)?;
43        let writer = encoder.into_inner().map_err(|_| {
44            std::io::Error::new(
45                std::io::ErrorKind::Other,
46                "failed to get writer out of encoder",
47            )
48        })?;
49        let end = writer.seek(SeekFrom::Current(0))?;
50        Ok(ByteCount {
51            read,
52            write: end - start,
53        })
54    }
55}