#[derive(Debug, Clone, PartialEq, Default)]
pub struct ParsedFlags {
pub case_insensitive: Option<bool>,
pub unicode_normalization: Option<String>,
pub feature_based: Option<bool>,
pub accent_insensitive: Option<bool>,
pub multiline: Option<bool>,
pub dotall: Option<bool>,
pub levenshtein_distance: Option<u8>,
}
impl ParsedFlags {
#[inline]
pub fn new() -> Self {
Self::default()
}
pub fn is_empty(&self) -> bool {
self.case_insensitive.is_none()
&& self.unicode_normalization.is_none()
&& self.feature_based.is_none()
&& self.accent_insensitive.is_none()
&& self.multiline.is_none()
&& self.dotall.is_none()
&& self.levenshtein_distance.is_none()
}
#[inline]
pub fn case_sensitive() -> Self {
Self {
case_insensitive: Some(false),
..Self::default()
}
}
#[inline]
pub fn case_insensitive_enabled() -> Self {
Self {
case_insensitive: Some(true),
..Self::default()
}
}
pub fn merge_with(&self, other: &ParsedFlags) -> ParsedFlags {
ParsedFlags {
case_insensitive: other.case_insensitive.or(self.case_insensitive),
unicode_normalization: other
.unicode_normalization
.clone()
.or_else(|| self.unicode_normalization.clone()),
feature_based: other.feature_based.or(self.feature_based),
accent_insensitive: other.accent_insensitive.or(self.accent_insensitive),
multiline: other.multiline.or(self.multiline),
dotall: other.dotall.or(self.dotall),
levenshtein_distance: other.levenshtein_distance.or(self.levenshtein_distance),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_is_empty() {
let flags = ParsedFlags::default();
assert!(flags.is_empty());
}
#[test]
fn test_case_sensitive_factory() {
let flags = ParsedFlags::case_sensitive();
assert!(!flags.is_empty());
assert_eq!(flags.case_insensitive, Some(false));
}
#[test]
fn test_case_insensitive_factory() {
let flags = ParsedFlags::case_insensitive_enabled();
assert!(!flags.is_empty());
assert_eq!(flags.case_insensitive, Some(true));
}
#[test]
fn test_merge_with() {
let base = ParsedFlags {
case_insensitive: Some(true),
accent_insensitive: Some(false),
..Default::default()
};
let override_flags = ParsedFlags {
case_insensitive: Some(false),
multiline: Some(true),
..Default::default()
};
let merged = base.merge_with(&override_flags);
assert_eq!(merged.case_insensitive, Some(false));
assert_eq!(merged.accent_insensitive, Some(false));
assert_eq!(merged.multiline, Some(true));
assert_eq!(merged.dotall, None);
}
#[test]
fn test_is_empty_with_flags() {
let mut flags = ParsedFlags::default();
assert!(flags.is_empty());
flags.case_insensitive = Some(true);
assert!(!flags.is_empty());
flags = ParsedFlags::default();
flags.levenshtein_distance = Some(2);
assert!(!flags.is_empty());
}
}