Skip to main content

codesynapse_core/
error.rs

1use thiserror::Error;
2
3#[derive(Error, Debug)]
4pub enum CodeSynapseError {
5    #[error("I/O error: {0}")]
6    Io(#[from] std::io::Error),
7
8    #[error("Serialization error: {0}")]
9    Serialization(#[from] serde_json::Error),
10
11    #[error("Binary serialization error: {0}")]
12    Bincode(#[from] bincode::Error),
13
14    #[error("Database error: {0}")]
15    Database(String),
16
17    #[error("Parse error: {0}")]
18    Parse(String),
19
20    #[error("Validation error: {0}")]
21    Validation(String),
22
23    #[error("Not found: {0}")]
24    NotFound(String),
25
26    #[error("{0}")]
27    Other(String),
28}
29
30impl CodeSynapseError {
31    pub fn msg(msg: impl Into<String>) -> Self {
32        CodeSynapseError::Other(msg.into())
33    }
34}
35
36pub type Result<T> = std::result::Result<T, CodeSynapseError>;
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41
42    #[test]
43    fn test_io_error_display() {
44        let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file not found");
45        let err = CodeSynapseError::Io(io_err);
46        let msg = format!("{}", err);
47        assert!(msg.contains("file not found"), "msg: {msg}");
48    }
49
50    #[test]
51    fn test_io_from_impl() {
52        let io_err = std::io::Error::new(std::io::ErrorKind::PermissionDenied, "permission");
53        let err: CodeSynapseError = io_err.into();
54        assert!(format!("{}", err).contains("permission"));
55    }
56
57    #[test]
58    fn test_validation_error() {
59        let err = CodeSynapseError::Validation("invalid input".into());
60        assert_eq!(format!("{}", err), "Validation error: invalid input");
61    }
62
63    #[test]
64    fn test_not_found_error() {
65        let err = CodeSynapseError::NotFound("node missing".into());
66        assert_eq!(format!("{}", err), "Not found: node missing");
67    }
68
69    #[test]
70    fn test_database_error() {
71        let err = CodeSynapseError::Database("connection failed".into());
72        assert_eq!(format!("{}", err), "Database error: connection failed");
73    }
74
75    #[test]
76    fn test_parse_error() {
77        let err = CodeSynapseError::Parse("bad syntax".into());
78        assert_eq!(format!("{}", err), "Parse error: bad syntax");
79    }
80
81    #[test]
82    fn test_other_error() {
83        let err = CodeSynapseError::Other("something went wrong".into());
84        assert_eq!(format!("{}", err), "something went wrong");
85    }
86
87    #[test]
88    fn test_serde_error() {
89        let serde_err = serde_json::from_str::<()>("invalid").unwrap_err();
90        let err = CodeSynapseError::Serialization(serde_err);
91        let msg = format!("{}", err);
92        assert!(msg.contains("Serialization error"));
93    }
94
95    #[test]
96    fn test_result_type_alias() {
97        let ok: Result<i32> = Ok(42);
98        assert!(matches!(ok, Ok(42)));
99
100        let err: Result<i32> = Err(CodeSynapseError::Other("fail".into()));
101        assert!(err.is_err());
102    }
103}