pub mod hir;
pub mod literal_expr;
use hir::ChromaHir;
use regex::Regex;
use regex_syntax::{hir::Properties, parse};
use thiserror::Error;
#[derive(Clone, Debug)]
pub struct ChromaRegex {
hir: ChromaHir,
pattern: String,
properties: Properties,
}
#[derive(Debug, Error)]
pub enum ChromaRegexError {
#[error("Byte pattern is not allowed")]
BytePattern,
#[error("Unexpected regex error: {0}")]
Regex(String),
#[error("Regex syntax errror: {0}")]
RegexSyntax(String),
}
impl ChromaRegex {
pub fn hir(&self) -> &ChromaHir {
&self.hir
}
pub fn properties(&self) -> &Properties {
&self.properties
}
pub fn regex(&self) -> Result<Regex, ChromaRegexError> {
Regex::new(&self.pattern).map_err(|e| ChromaRegexError::Regex(e.to_string()))
}
}
impl TryFrom<String> for ChromaRegex {
type Error = ChromaRegexError;
fn try_from(value: String) -> Result<Self, Self::Error> {
let hir = parse(&value).map_err(|e| ChromaRegexError::RegexSyntax(e.to_string()))?;
let properties = hir.properties().clone();
Ok(Self {
hir: hir.try_into()?,
pattern: value,
properties,
})
}
}