use crate::errors::ConfigError;
use anyhow::Result;
use byte_unit::Byte;
use regex::Regex;
use std::str::FromStr;
pub(super) fn parse_max_size(max_size_str: Option<String>) -> Result<Option<u128>, ConfigError> {
max_size_str
.map(|s| {
Byte::from_str(&s)
.map(|b| b.as_u128()) .map_err(|_| ConfigError::InvalidSizeFormat(s.clone()))
})
.transpose() }
pub(super) fn compile_regex_vec(
patterns: Option<Vec<String>>,
name: &str,
) -> Result<Option<Vec<Regex>>, ConfigError> {
patterns
.map(|vec| {
vec.into_iter()
.map(|p| {
regex::RegexBuilder::new(&p)
.case_insensitive(true) .build()
.map_err(|e| ConfigError::InvalidRegex {
name: name.to_string(),
pattern: p.clone(),
source: e,
})
})
.collect::<Result<Vec<_>, _>>()
})
.transpose()
}
pub(super) fn normalize_extensions(exts: Option<Vec<String>>) -> Option<Vec<String>> {
exts.map(|v| v.into_iter().map(|s| s.to_lowercase()).collect())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_valid_max_size() -> Result<()> {
assert_eq!(parse_max_size(Some("10k".to_string()))?, Some(10 * 1000));
assert_eq!(
parse_max_size(Some("2MiB".to_string()))?,
Some(2 * 1024 * 1024)
);
assert_eq!(parse_max_size(Some("1024".to_string()))?, Some(1024));
assert_eq!(parse_max_size(None)?, None);
Ok(())
}
#[test]
fn test_parse_invalid_max_size() {
let result = parse_max_size(Some("invalid".to_string()));
assert!(matches!(result, Err(ConfigError::InvalidSizeFormat(_))));
assert!(result
.unwrap_err()
.to_string()
.contains("Invalid size format"));
}
#[test]
fn test_compile_valid_regex() -> Result<()> {
let patterns = Some(vec!["^abc$".to_string(), ".*".to_string()]);
let regexes = compile_regex_vec(patterns, "test")?;
assert!(regexes.is_some());
assert_eq!(regexes.unwrap().len(), 2);
assert!(compile_regex_vec(None, "test")?.is_none());
Ok(())
}
#[test]
fn test_compile_invalid_regex() {
let patterns = Some(vec!["[".to_string()]); let result = compile_regex_vec(patterns, "test");
assert!(matches!(result, Err(ConfigError::InvalidRegex { .. })));
assert!(result
.unwrap_err()
.to_string()
.contains("Invalid test regex"));
}
#[test]
fn test_normalize_exts() {
let exts = Some(vec!["Txt".to_string(), "RS".to_string()]);
let normalized = normalize_extensions(exts);
assert_eq!(normalized, Some(vec!["txt".to_string(), "rs".to_string()]));
assert!(normalize_extensions(None).is_none());
}
}