use std::path::PathBuf;
#[derive(Debug)]
pub enum PolicyError {
FileRead {
path: PathBuf,
source: std::io::Error,
},
ParseError { path: PathBuf, message: String },
InvalidPolicy { policy_id: String, reason: String },
RegexError { pattern: String, message: String },
InvalidKeepExpression { expression: String, reason: String },
FieldError { reason: String },
CompileError { reason: String },
FileWatch { path: PathBuf, message: String },
HttpError(String),
GrpcError(String),
}
impl std::fmt::Display for PolicyError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PolicyError::FileRead { path, source } => {
write!(f, "failed to read policy file {:?}: {}", path, source)
}
PolicyError::ParseError { path, message } => {
write!(f, "failed to parse policy file {:?}: {}", path, message)
}
PolicyError::InvalidPolicy { policy_id, reason } => {
write!(f, "invalid policy '{}': {}", policy_id, reason)
}
PolicyError::RegexError { pattern, message } => {
write!(f, "invalid regex pattern '{}': {}", pattern, message)
}
PolicyError::InvalidKeepExpression { expression, reason } => {
write!(f, "invalid keep expression '{}': {}", expression, reason)
}
PolicyError::FieldError { reason } => {
write!(f, "field error: {}", reason)
}
PolicyError::CompileError { reason } => {
write!(f, "failed to compile Hyperscan database: {}", reason)
}
PolicyError::FileWatch { path, message } => {
write!(f, "failed to watch policy file {:?}: {}", path, message)
}
PolicyError::HttpError(msg) => {
write!(f, "HTTP provider error: {}", msg)
}
PolicyError::GrpcError(msg) => {
write!(f, "gRPC provider error: {}", msg)
}
}
}
}
impl std::error::Error for PolicyError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
PolicyError::FileRead { source, .. } => Some(source),
_ => None,
}
}
}