#![forbid(unsafe_code)]
#![doc = include_str!("../README.md")]
use core::fmt;
pub const CAB_EXTENSION: &str = "cab";
pub const CAB_EXTENSIONS: &[&str] = &["cab"];
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum CabFormat {
Cabinet,
#[default]
Unknown,
}
impl CabFormat {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Cabinet => "cabinet",
Self::Unknown => "unknown",
}
}
}
impl fmt::Display for CabFormat {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum CabCompressionMethod {
None,
MsZip,
Quantum,
Lzx,
#[default]
Unknown,
}
impl CabCompressionMethod {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::None => "none",
Self::MsZip => "mszip",
Self::Quantum => "quantum",
Self::Lzx => "lzx",
Self::Unknown => "unknown",
}
}
}
impl fmt::Display for CabCompressionMethod {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
#[must_use]
pub fn is_cab_extension(extension: &str) -> bool {
normalize_extension(extension) == "cab"
}
#[must_use]
pub fn is_cab_filename(name: &str) -> bool {
let parts = filename_parts(name);
matches!(parts.as_slice(), [.., last] if last == "cab")
}
fn normalize_extension(extension: &str) -> String {
extension
.trim()
.trim_start_matches('.')
.to_ascii_lowercase()
}
fn filename_parts(name: &str) -> Vec<String> {
name.trim()
.to_ascii_lowercase()
.rsplit(['/', '\\'])
.next()
.unwrap_or_default()
.trim_start_matches('.')
.split('.')
.filter(|part| !part.is_empty())
.map(str::to_owned)
.collect()
}
#[cfg(test)]
mod tests {
use super::{
CAB_EXTENSIONS, CabCompressionMethod, CabFormat, is_cab_extension, is_cab_filename,
};
#[test]
fn detects_cab_extensions() {
assert!(is_cab_extension(".cab"));
assert_eq!(CAB_EXTENSIONS[0], "cab");
}
#[test]
fn detects_cab_filenames() {
assert!(is_cab_filename("driver.cab"));
assert!(is_cab_filename("DRIVER.CAB"));
assert!(!is_cab_filename("bundle.zip"));
}
#[test]
fn exposes_default_and_unknown_labels() {
assert_eq!(CabFormat::default(), CabFormat::Unknown);
assert_eq!(CabFormat::Cabinet.as_str(), "cabinet");
assert_eq!(
CabCompressionMethod::default(),
CabCompressionMethod::Unknown
);
assert_eq!(CabCompressionMethod::MsZip.as_str(), "mszip");
}
}