use std::io::{Write, Error, ErrorKind}; use std::io; use InflateStream; /// A DEFLATE decoder. /// /// A struct implementing the `std::io::Write` trait that decompresses DEFLATE /// encoded data into the given writer `w`. /// /// # Example /// /// ``` /// use inflate::InflateWriter; /// use std::io::Write; /// /// let encoded = [243, 72, 205, 201, 201, 215, 81, 40, 207, 47, 202, 73, 1, 0]; /// let mut decoder = InflateWriter::new(Vec::new()); /// decoder.write(&encoded).unwrap(); /// let decoded = decoder.finish().unwrap(); /// println!("{}", std::str::from_utf8(&decoded).unwrap()); // prints "Hello, world" /// ``` pub struct InflateWriter { inflater: InflateStream, writer: W } impl InflateWriter { pub fn new(w: W) -> InflateWriter { InflateWriter { inflater: InflateStream::new(), writer: w } } pub fn from_zlib(w: W) -> InflateWriter { InflateWriter { inflater: InflateStream::from_zlib(), writer: w } } pub fn finish(mut self) -> io::Result { try!(self.flush()); Ok(self.writer) } } fn update<'a>(inflater: &'a mut InflateStream, buf: &[u8]) -> io::Result<(usize, &'a [u8])> { match inflater.update(buf) { Ok(res) => Ok(res), Err(m) => return Err(Error::new(ErrorKind::Other, m)), } } impl Write for InflateWriter { fn write(&mut self, buf: &[u8]) -> io::Result { let mut n = 0; while n < buf.len() { let (num_bytes_read, result) = try!(update(&mut self.inflater, &buf[n..])); n += num_bytes_read; try!(self.writer.write(result)); } Ok(n) } fn flush(&mut self) -> io::Result<()> { let (_, result) = try!(update(&mut self.inflater, &[])); try!(self.writer.write(result)); Ok(()) } } #[cfg(test)] mod test { use super::InflateWriter; use std::io::Write; #[test] fn inflate_writer() { let encoded = [243, 72, 205, 201, 201, 215, 81, 40, 207, 47, 202, 73, 1, 0]; let mut decoder = InflateWriter::new(Vec::new()); decoder.write(&encoded).unwrap(); let decoded = decoder.finish().unwrap(); assert!(String::from_utf8(decoded).unwrap() == "Hello, world"); } #[test] fn inflate_writer_from_zlib() { let encoded = [120, 156, 243, 72, 205, 201, 201, 215, 81, 168, 202, 201, 76, 82, 4, 0, 27, 101, 4, 19]; let mut decoder = InflateWriter::from_zlib(Vec::new()); decoder.write(&encoded).unwrap(); let decoded = decoder.finish().unwrap(); assert!(String::from_utf8(decoded).unwrap() == "Hello, zlib!"); } }