Skip to main content

adk_guardrail/
error.rs

1use crate::Severity;
2
3/// Errors produced by guardrail validation.
4#[derive(Debug, thiserror::Error)]
5pub enum GuardrailError {
6    /// A single guardrail check failed.
7    #[error("Guardrail '{name}' failed: {reason}")]
8    ValidationFailed { name: String, reason: String, severity: Severity },
9
10    /// Multiple guardrails failed in a single execution.
11    #[error("Multiple guardrails failed: {0:?}")]
12    MultipleFailures(Vec<GuardrailError>),
13
14    /// JSON schema validation error.
15    #[error("Schema validation error: {0}")]
16    Schema(String),
17
18    /// Invalid regex pattern in a guardrail configuration.
19    #[error("Regex error: {0}")]
20    Regex(#[from] regex::Error),
21
22    /// Unexpected internal error.
23    #[error("Internal error: {0}")]
24    Internal(String),
25}
26
27/// Convenience alias for guardrail operations.
28pub 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}