use thiserror::Error;
#[derive(Debug, Error)]
pub enum EvalError {
#[error("invalid regex pattern: {0}")]
InvalidRegex(#[from] regex::Error),
#[error("invalid CIDR: {0}")]
InvalidCidr(#[from] ipnet::AddrParseError),
#[error("base64 encoding error: {0}")]
Base64(String),
#[error("unknown detection identifier: {0}")]
UnknownDetection(String),
#[error("invalid modifier combination: {0}")]
InvalidModifiers(String),
#[error("incompatible value for modifier: {0}")]
IncompatibleValue(String),
#[error("expected numeric value: {0}")]
ExpectedNumeric(String),
#[error("parser error: {0}")]
Parser(#[from] rsigma_parser::SigmaParserError),
#[error("correlation error: {0}")]
CorrelationError(String),
#[error("unknown rule reference: {0}")]
UnknownRuleRef(String),
#[error("correlation cycle detected: {0}")]
CorrelationCycle(String),
#[error("IR lowering error: {0}")]
Ir(String),
#[error("HIR cache error: {0}")]
HirCache(String),
}
impl From<rsigma_ir::CacheError> for EvalError {
fn from(err: rsigma_ir::CacheError) -> Self {
EvalError::HirCache(err.to_string())
}
}
impl From<rsigma_ir::IrError> for EvalError {
fn from(err: rsigma_ir::IrError) -> Self {
use rsigma_ir::IrError;
match err {
IrError::UnknownDetection(name) => EvalError::UnknownDetection(name),
IrError::InvalidModifiers(msg) => EvalError::InvalidModifiers(msg),
IrError::IncompatibleValue(msg) => EvalError::IncompatibleValue(msg),
IrError::ExpectedNumeric(msg) => EvalError::ExpectedNumeric(msg),
IrError::Parser(e) => EvalError::Parser(e),
other => EvalError::Ir(other.to_string()),
}
}
}
pub type Result<T> = std::result::Result<T, EvalError>;