1use thiserror::Error;
4
5pub type Result<T> = std::result::Result<T, GuardError>;
7
8#[derive(Debug, Error)]
10pub enum GuardError {
11 #[error("Content blocked: {reason} (category: {category:?})")]
13 ContentBlocked {
14 reason: String,
15 category: SafetyCategory,
16 },
17
18 #[error("Rate limit exceeded: {0}")]
20 RateLimitExceeded(String),
21
22 #[error("PII detection error: {0}")]
24 PiiDetectionError(String),
25
26 #[error("Injection detection error: {0}")]
28 InjectionDetectionError(String),
29
30 #[error("Content filter error: {0}")]
32 ContentFilterError(String),
33
34 #[error("Configuration error: {0}")]
36 ConfigError(String),
37
38 #[error("Serialization error: {0}")]
40 SerializationError(#[from] serde_json::Error),
41
42 #[error("IO error: {0}")]
44 IoError(#[from] std::io::Error),
45
46 #[cfg(feature = "content-filter")]
48 #[error("HTTP error: {0}")]
49 HttpError(#[from] reqwest::Error),
50}
51
52#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
54pub enum SafetyCategory {
55 Violent,
57 IllegalActs,
59 SexualContent,
61 Pii,
63 SelfHarm,
65 UnethicalActs,
67 PoliticallySensitive,
69 CopyrightViolation,
71 Jailbreak,
73 None,
75}
76
77impl std::fmt::Display for SafetyCategory {
78 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
79 match self {
80 SafetyCategory::Violent => write!(f, "Violent"),
81 SafetyCategory::IllegalActs => write!(f, "Non-violent Illegal Acts"),
82 SafetyCategory::SexualContent => write!(f, "Sexual Content"),
83 SafetyCategory::Pii => write!(f, "PII"),
84 SafetyCategory::SelfHarm => write!(f, "Suicide & Self-Harm"),
85 SafetyCategory::UnethicalActs => write!(f, "Unethical Acts"),
86 SafetyCategory::PoliticallySensitive => write!(f, "Politically Sensitive"),
87 SafetyCategory::CopyrightViolation => write!(f, "Copyright Violation"),
88 SafetyCategory::Jailbreak => write!(f, "Jailbreak"),
89 SafetyCategory::None => write!(f, "None"),
90 }
91 }
92}