#![doc(html_root_url = "https://docs.rs/flate2/0.2")]
#![deny(missing_docs)]
#![deny(missing_debug_implementations)]
#![allow(trivial_numeric_casts)]
#![cfg_attr(test, deny(warnings))]
#[cfg(feature = "tokio")]
extern crate futures;
extern crate libc;
#[cfg(test)]
extern crate quickcheck;
#[cfg(test)]
extern crate rand;
#[cfg(feature = "tokio")]
#[macro_use]
extern crate tokio_io;
use std::io::prelude::*;
use std::io;
pub use gz::Builder as GzBuilder;
pub use gz::Header as GzHeader;
pub use mem::{Compress, DataError, Decompress, Flush, Status};
pub use crc::{Crc, CrcReader};
mod bufreader;
mod crc;
mod deflate;
mod ffi;
mod gz;
mod zio;
mod mem;
mod zlib;
pub mod read {
pub use deflate::read::DeflateEncoder;
pub use deflate::read::DeflateDecoder;
pub use zlib::read::ZlibEncoder;
pub use zlib::read::ZlibDecoder;
pub use gz::read::GzEncoder;
pub use gz::read::GzDecoder;
pub use gz::read::MultiGzDecoder;
}
pub mod write {
pub use deflate::write::DeflateEncoder;
pub use deflate::write::DeflateDecoder;
pub use zlib::write::ZlibEncoder;
pub use zlib::write::ZlibDecoder;
pub use gz::write::GzEncoder;
}
pub mod bufread {
pub use deflate::bufread::DeflateEncoder;
pub use deflate::bufread::DeflateDecoder;
pub use zlib::bufread::ZlibEncoder;
pub use zlib::bufread::ZlibDecoder;
pub use gz::bufread::GzEncoder;
pub use gz::bufread::GzDecoder;
pub use gz::bufread::MultiGzDecoder;
}
fn _assert_send_sync() {
fn _assert_send_sync<T: Send + Sync>() {}
_assert_send_sync::<read::DeflateEncoder<&[u8]>>();
_assert_send_sync::<read::DeflateDecoder<&[u8]>>();
_assert_send_sync::<read::ZlibEncoder<&[u8]>>();
_assert_send_sync::<read::ZlibDecoder<&[u8]>>();
_assert_send_sync::<read::GzEncoder<&[u8]>>();
_assert_send_sync::<read::GzDecoder<&[u8]>>();
_assert_send_sync::<read::MultiGzDecoder<&[u8]>>();
_assert_send_sync::<write::DeflateEncoder<Vec<u8>>>();
_assert_send_sync::<write::DeflateDecoder<Vec<u8>>>();
_assert_send_sync::<write::ZlibEncoder<Vec<u8>>>();
_assert_send_sync::<write::ZlibDecoder<Vec<u8>>>();
_assert_send_sync::<write::GzEncoder<Vec<u8>>>();
}
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
pub enum Compression {
None = 0,
Fast = 1,
Best = 9,
Default = 6,
}
impl Default for Compression {
fn default() -> Compression {
Compression::Default
}
}
pub trait FlateReadExt: Read + Sized {
fn gz_encode(self, lvl: Compression) -> read::GzEncoder<Self> {
read::GzEncoder::new(self, lvl)
}
fn gz_decode(self) -> io::Result<read::GzDecoder<Self>> {
read::GzDecoder::new(self)
}
fn zlib_encode(self, lvl: Compression) -> read::ZlibEncoder<Self> {
read::ZlibEncoder::new(self, lvl)
}
fn zlib_decode(self) -> read::ZlibDecoder<Self> {
read::ZlibDecoder::new(self)
}
fn deflate_encode(self, lvl: Compression) -> read::DeflateEncoder<Self> {
read::DeflateEncoder::new(self, lvl)
}
fn deflate_decode(self) -> read::DeflateDecoder<Self> {
read::DeflateDecoder::new(self)
}
}
pub trait FlateWriteExt: Write + Sized {
fn gz_encode(self, lvl: Compression) -> write::GzEncoder<Self> {
write::GzEncoder::new(self, lvl)
}
fn zlib_encode(self, lvl: Compression) -> write::ZlibEncoder<Self> {
write::ZlibEncoder::new(self, lvl)
}
fn zlib_decode(self) -> write::ZlibDecoder<Self> {
write::ZlibDecoder::new(self)
}
fn deflate_encode(self, lvl: Compression) -> write::DeflateEncoder<Self> {
write::DeflateEncoder::new(self, lvl)
}
fn deflate_decode(self) -> write::DeflateDecoder<Self> {
write::DeflateDecoder::new(self)
}
}
impl<T: Read> FlateReadExt for T {}
impl<T: Write> FlateWriteExt for T {}
#[cfg(test)]
mod test {
use std::io::prelude::*;
use {Compression, FlateReadExt};
#[test]
fn crazy() {
let rdr = &mut b"foobar";
let mut res = Vec::new();
rdr.gz_encode(Compression::Default)
.deflate_encode(Compression::Default)
.zlib_encode(Compression::Default)
.zlib_decode()
.deflate_decode()
.gz_decode()
.unwrap()
.read_to_end(&mut res)
.unwrap();
assert_eq!(res, b"foobar");
}
}