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