use-gzip 0.1.0

Gzip labels and option metadata for RustUse
Documentation
#![forbid(unsafe_code)]
#![doc = include_str!("../README.md")]

//! Gzip labels and option metadata for `RustUse`.

/// Common gzip file extension.
pub const GZIP_EXTENSION: &str = "gz";
/// Common gzip-compressed tar extension.
pub const TAR_GZIP_EXTENSION: &str = "tar.gz";
/// Common HTTP content-encoding label for gzip.
pub const GZIP_ENCODING_LABEL: &str = "gzip";
/// Common gzip media type.
pub const GZIP_MEDIA_TYPE: &str = "application/gzip";
/// Common gzip-related extensions.
pub const GZIP_EXTENSIONS: &[&str] = &["gz", "gzip", "tgz", "tar.gz"];

/// Metadata strategy for gzip headers.
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum GzipHeaderMode {
    /// Minimal metadata.
    #[default]
    Minimal,
    /// Include file metadata labels when available.
    FileMetadata,
    /// Unknown or intentionally unspecified header behavior.
    Unknown,
}

impl GzipHeaderMode {
    /// Returns a stable lowercase label.
    #[must_use]
    pub const fn as_str(self) -> &'static str {
        match self {
            Self::Minimal => "minimal",
            Self::FileMetadata => "file-metadata",
            Self::Unknown => "unknown",
        }
    }
}

/// Gzip option metadata.
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct GzipOptions {
    /// Numeric gzip level, when specified by the caller.
    pub level: Option<u32>,
    /// Gzip header metadata strategy.
    pub header_mode: GzipHeaderMode,
}

impl GzipOptions {
    /// Creates default gzip option metadata.
    #[must_use]
    pub const fn new() -> Self {
        Self {
            level: None,
            header_mode: GzipHeaderMode::Minimal,
        }
    }

    /// Adds a numeric compression level label.
    #[must_use]
    pub const fn with_level(mut self, level: u32) -> Self {
        self.level = Some(level);
        self
    }

    /// Sets the gzip header metadata strategy.
    #[must_use]
    pub const fn with_header_mode(mut self, header_mode: GzipHeaderMode) -> Self {
        self.header_mode = header_mode;
        self
    }
}

#[cfg(test)]
mod tests {
    use super::{GZIP_ENCODING_LABEL, GZIP_EXTENSIONS, GzipHeaderMode, GzipOptions};

    #[test]
    fn exposes_gzip_labels() {
        assert_eq!(GZIP_ENCODING_LABEL, "gzip");
        assert!(GZIP_EXTENSIONS.contains(&"tar.gz"));
    }

    #[test]
    fn stores_option_metadata() {
        let options = GzipOptions::new()
            .with_level(6)
            .with_header_mode(GzipHeaderMode::FileMetadata);

        assert_eq!(options.level, Some(6));
        assert_eq!(options.header_mode.as_str(), "file-metadata");
    }
}