use std::sync::Arc;
use regex::Regex;
use super::SearchError;
pub const DEFAULT_NFA_SIZE_LIMIT: usize = 256 * 1024;
#[non_exhaustive]
#[derive(Clone, Debug)]
pub enum SearchPattern {
Regex(RegexPattern),
Literal(String),
}
#[derive(Clone, Debug)]
pub struct RegexPattern {
pub(super) re: Arc<Regex>,
pub(super) src: Arc<str>,
}
impl SearchPattern {
pub fn regex(pattern: &str) -> Result<Self, SearchError> {
Self::regex_with_limit(pattern, DEFAULT_NFA_SIZE_LIMIT)
}
pub fn regex_with_limit(pattern: &str, size_limit: usize) -> Result<Self, SearchError> {
if pattern.is_empty() {
return Err(SearchError::EmptyPattern);
}
let re = regex::RegexBuilder::new(pattern)
.multi_line(true)
.size_limit(size_limit)
.build()
.map_err(|err| SearchError::InvalidRegex {
pattern: pattern.to_owned(),
source: err.into(),
})?;
Ok(SearchPattern::Regex(RegexPattern {
re: Arc::new(re),
src: Arc::from(pattern),
}))
}
#[must_use]
pub fn literal(needle: impl Into<String>) -> Self {
SearchPattern::Literal(needle.into())
}
}