Skip to main content

kernex_core/
error.rs

1//! Unified error type for all Kernex crates.
2
3/// Top-level error type for Kernex.
4#[derive(Debug, thiserror::Error)]
5pub enum KernexError {
6    /// Error from an AI provider.
7    #[error("provider error: {0}")]
8    Provider(String),
9
10    /// Memory/storage error.
11    #[error("store error: {0}")]
12    Store(String),
13
14    /// Sandbox execution error.
15    #[error("sandbox error: {0}")]
16    Sandbox(String),
17
18    /// Configuration error.
19    #[error("config error: {0}")]
20    Config(String),
21
22    /// Pipeline execution error.
23    #[error("pipeline error: {0}")]
24    Pipeline(String),
25
26    /// Skill loading/matching error.
27    #[error("skill error: {0}")]
28    Skill(String),
29
30    /// I/O error.
31    #[error(transparent)]
32    Io(#[from] std::io::Error),
33
34    /// Serialization error.
35    #[error(transparent)]
36    Serialization(#[from] serde_json::Error),
37}
38
39pub type Result<T> = std::result::Result<T, KernexError>;
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn test_io_error_display() {
47        let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file missing");
48        let err = KernexError::from(io_err);
49        let display = format!("{err}");
50        assert!(display.contains("file missing"));
51    }
52
53    #[test]
54    fn test_provider_error_display() {
55        let err = KernexError::Provider("timeout".into());
56        assert_eq!(format!("{err}"), "provider error: timeout");
57    }
58
59    #[test]
60    fn test_config_error_display() {
61        let err = KernexError::Config("missing field".into());
62        assert_eq!(format!("{err}"), "config error: missing field");
63    }
64
65    #[test]
66    fn test_store_error_display() {
67        let err = KernexError::Store("connection failed".into());
68        assert_eq!(format!("{err}"), "store error: connection failed");
69    }
70}