1use crate::Severity;
2
3#[derive(Debug, thiserror::Error)]
5pub enum GuardrailError {
6 #[error("Guardrail '{name}' failed: {reason}")]
8 ValidationFailed { name: String, reason: String, severity: Severity },
9
10 #[error("Multiple guardrails failed: {0:?}")]
12 MultipleFailures(Vec<GuardrailError>),
13
14 #[error("Schema validation error: {0}")]
16 Schema(String),
17
18 #[error("Regex error: {0}")]
20 Regex(#[from] regex::Error),
21
22 #[error("Internal error: {0}")]
24 Internal(String),
25}
26
27pub type Result<T> = std::result::Result<T, GuardrailError>;
29
30impl From<GuardrailError> for adk_core::AdkError {
31 fn from(err: GuardrailError) -> Self {
32 use adk_core::{ErrorCategory, ErrorComponent};
33 let (category, code) = match &err {
34 GuardrailError::ValidationFailed { .. } => {
35 (ErrorCategory::InvalidInput, "guardrail.validation_failed")
36 }
37 GuardrailError::MultipleFailures(_) => {
38 (ErrorCategory::InvalidInput, "guardrail.multiple_failures")
39 }
40 GuardrailError::Schema(_) => (ErrorCategory::InvalidInput, "guardrail.schema"),
41 GuardrailError::Regex(_) => (ErrorCategory::InvalidInput, "guardrail.regex"),
42 GuardrailError::Internal(_) => (ErrorCategory::Internal, "guardrail.internal"),
43 };
44 adk_core::AdkError::new(ErrorComponent::Guardrail, category, code, err.to_string())
45 .with_source(err)
46 }
47}