stream_unpack/zip/structures/
mod.rs

1use thiserror::Error;
2
3use crate::decompress::Decompressor;
4
5#[cfg(feature = "deflate")]
6use crate::decompress::deflate::DeflateDecompressor;
7
8/// Provides utilities for locating a ZIP central directory
9pub mod cd_location;
10
11/// Provides general ZIP file header utilities
12pub mod file_header;
13
14/// Provides utilities for processing ZIP central directory file headers
15pub mod central_directory;
16
17/// Provides utilities for processing ZIP local file headers
18pub mod local_file_header;
19
20#[derive(Error, Debug)]
21pub enum DecompressorCreationError {
22    #[error("unknown compression method: {0}")]
23    UnknownMethod(u16)
24}
25
26/// Represents a ZIP compression method. 
27/// See [CompressionMethod::create_decompressor]
28#[derive(Debug, Clone)]
29pub enum CompressionMethod {
30    #[cfg(feature = "deflate")]
31    Deflate,
32
33    Unknown(u16)
34}
35
36impl CompressionMethod {
37    /// Tries to turn a ZIP compression id into a [CompressionMethod] variant. 
38    /// 
39    /// Returns None if the id is 0, [CompressionMethod::Unknown] if a 
40    /// decompressor for it is not available
41    pub fn from_id(id: u16) -> Option<Self> {
42        match id {
43            0 => None,
44
45            #[cfg(feature = "deflate")]
46            8 => Some(Self::Deflate),
47
48            _ => Some(Self::Unknown(id))
49        }
50    }
51
52    /// Tries to create a [Decompressor] for this [CompressionMethod]
53    /// 
54    /// Returns error if it is [CompressionMethod::Unknown]
55    pub fn create_decompressor(&self) -> Result<Box<dyn Decompressor>, DecompressorCreationError> {
56        match self {
57            #[cfg(feature = "deflate")]
58            Self::Deflate => Ok(Box::new(DeflateDecompressor::new())),
59
60            Self::Unknown(id) => Err(DecompressorCreationError::UnknownMethod(*id))
61        }
62    }
63
64    /// Returns whether decompression is supported for this method
65    pub fn is_supported(&self) -> bool {
66        !(matches!(self, Self::Unknown(..)))
67    }
68}