#[derive(Debug, thiserror::Error)]
pub enum KernexError {
#[error("provider error: {0}")]
Provider(String),
#[error("store error: {0}")]
Store(String),
#[error("sandbox error: {0}")]
Sandbox(String),
#[error("config error: {0}")]
Config(String),
#[error("pipeline error: {0}")]
Pipeline(String),
#[error("skill error: {0}")]
Skill(String),
#[error(transparent)]
Io(#[from] std::io::Error),
#[error(transparent)]
Serialization(#[from] serde_json::Error),
#[error("guardrail blocked: {0}")]
Guardrail(String),
}
pub type Result<T> = std::result::Result<T, KernexError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_io_error_display() {
let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file missing");
let err = KernexError::from(io_err);
let display = format!("{err}");
assert!(display.contains("file missing"));
}
#[test]
fn test_provider_error_display() {
let err = KernexError::Provider("timeout".into());
assert_eq!(format!("{err}"), "provider error: timeout");
}
#[test]
fn test_config_error_display() {
let err = KernexError::Config("missing field".into());
assert_eq!(format!("{err}"), "config error: missing field");
}
#[test]
fn test_store_error_display() {
let err = KernexError::Store("connection failed".into());
assert_eq!(format!("{err}"), "store error: connection failed");
}
}