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 56 57 58
use std::io::Write; use crate::errors::*; pub enum Compressor { None(Vec<u8>), Gzip(libflate::gzip::Encoder<Vec<u8>>), } impl Write for Compressor { fn write(&mut self, content: &[u8]) -> Result<usize, std::io::Error> { match self { Compressor::None(data) => data.write(content), Compressor::Gzip(encoder) => encoder.write(content), } } fn flush(&mut self) -> Result<(), std::io::Error> { match self { Compressor::None(data) => data.flush(), Compressor::Gzip(encoder) => encoder.flush(), } } } impl std::str::FromStr for Compressor { type Err = RPMError; fn from_str(raw: &str) -> Result<Self, Self::Err> { match raw { "none" => Ok(Compressor::None(Vec::new())), "gzip" => Ok(Compressor::Gzip(libflate::gzip::Encoder::new(Vec::new())?)), _ => Err(RPMError::UnknownCompressorType(raw.to_string())), } } } impl Compressor { pub(crate) fn finish_compression(self) -> Result<Vec<u8>, RPMError> { match self { Compressor::None(data) => Ok(data), Compressor::Gzip(encoder) => Ok(encoder.finish().into_result()?), } } pub(crate) fn get_details(&self) -> Option<CompressionDetails> { match self { Compressor::None(_) => None, Compressor::Gzip(_) => Some(CompressionDetails { compression_level: "9", compression_name: "gzip", }), } } } pub(crate) struct CompressionDetails { pub(crate) compression_level: &'static str, pub(crate) compression_name: &'static str, }