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}