use thiserror::Error;
pub type Result<T> = std::result::Result<T, GuardError>;
#[derive(Debug, Error)]
pub enum GuardError {
#[error("Content blocked: {reason} (category: {category:?})")]
ContentBlocked {
reason: String,
category: SafetyCategory,
},
#[error("Rate limit exceeded: {0}")]
RateLimitExceeded(String),
#[error("PII detection error: {0}")]
PiiDetectionError(String),
#[error("Injection detection error: {0}")]
InjectionDetectionError(String),
#[error("Content filter error: {0}")]
ContentFilterError(String),
#[error("Configuration error: {0}")]
ConfigError(String),
#[error("Serialization error: {0}")]
SerializationError(#[from] serde_json::Error),
#[error("IO error: {0}")]
IoError(#[from] std::io::Error),
#[cfg(feature = "content-filter")]
#[error("HTTP error: {0}")]
HttpError(#[from] reqwest::Error),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub enum SafetyCategory {
Violent,
IllegalActs,
SexualContent,
Pii,
SelfHarm,
UnethicalActs,
PoliticallySensitive,
CopyrightViolation,
Jailbreak,
None,
}
impl std::fmt::Display for SafetyCategory {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
SafetyCategory::Violent => write!(f, "Violent"),
SafetyCategory::IllegalActs => write!(f, "Non-violent Illegal Acts"),
SafetyCategory::SexualContent => write!(f, "Sexual Content"),
SafetyCategory::Pii => write!(f, "PII"),
SafetyCategory::SelfHarm => write!(f, "Suicide & Self-Harm"),
SafetyCategory::UnethicalActs => write!(f, "Unethical Acts"),
SafetyCategory::PoliticallySensitive => write!(f, "Politically Sensitive"),
SafetyCategory::CopyrightViolation => write!(f, "Copyright Violation"),
SafetyCategory::Jailbreak => write!(f, "Jailbreak"),
SafetyCategory::None => write!(f, "None"),
}
}
}