fluvio-compression 0.2.5

Fluvio Compression library
Documentation
use std::io::{Read, Write};
use bytes::{BufMut, Bytes, BytesMut};

use crate::error::CompressionError;
use snap::{read::FrameDecoder, write::FrameEncoder};

pub fn compress(src: &[u8]) -> Result<Bytes, CompressionError> {
    let buf = BytesMut::with_capacity(src.len());
    let mut encoder = FrameEncoder::new(buf.writer());
    encoder.write_all(src)?;
    Ok(encoder
        .into_inner()
        .map(|w| w.into_inner().freeze())
        .map_err(Box::new)?)
}

pub fn uncompress<T: Read>(src: T) -> Result<Vec<u8>, CompressionError> {
    let mut buffer: Vec<u8> = Vec::new();
    FrameDecoder::new(src).read_to_end(&mut buffer)?;

    Ok(buffer)
}

#[cfg(test)]
mod tests {
    use bytes::Buf;
    use super::*;

    #[test]
    fn test_compress_decompress() {
        let text = "FLUVIO_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
        let compressed = compress(text.as_bytes()).unwrap();

        assert!(compressed.len() < text.as_bytes().len());

        let uncompressed = String::from_utf8(uncompress(compressed.reader()).unwrap()).unwrap();

        assert_eq!(uncompressed, text);
    }
}