use crate::MimeMagicMatcher;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MimeMagic {
priority: u16,
matchers: Vec<MimeMagicMatcher>,
}
impl MimeMagic {
pub const MIN_PRIORITY: u16 = 0;
pub const MAX_PRIORITY: u16 = 100;
pub const DEFAULT_PRIORITY: u16 = 50;
pub fn new(priority: u16, matchers: Vec<MimeMagicMatcher>) -> Self {
Self { priority, matchers }
}
pub fn priority(&self) -> u16 {
self.priority
}
pub fn matchers(&self) -> &[MimeMagicMatcher] {
&self.matchers
}
pub fn max_test_bytes(&self) -> usize {
self.matchers
.iter()
.map(MimeMagicMatcher::max_test_bytes)
.max()
.unwrap_or(0)
}
pub fn matches(&self, bytes: &[u8]) -> bool {
self.matchers.iter().any(|matcher| matcher.matches(bytes))
}
}
#[cfg(coverage)]
pub(crate) mod coverage_support {
use crate::{MagicValueType, MimeMagicMatcher};
use super::MimeMagic;
pub(crate) fn exercise_magic_edges() -> Vec<String> {
let empty = MimeMagic::new(0, Vec::new());
let matcher =
MimeMagicMatcher::new(MagicValueType::String, 0, 0, b"ABC".to_vec(), None, vec![])
.expect("matcher should be valid");
let magic = MimeMagic::new(25, vec![matcher]);
vec![
empty.matchers().len().to_string(),
empty.max_test_bytes().to_string(),
empty.matches(b"ABC").to_string(),
magic.matchers().len().to_string(),
magic.matches(b"ABC").to_string(),
]
}
}