solverforge_core/
error.rs1use thiserror::Error;
8
9pub type SolverForgeResult<T> = Result<T, SolverForgeError>;
10
11#[derive(Error, Debug)]
13pub enum SolverForgeError {
14 #[error("Serialization error: {0}")]
16 Serialization(String),
17
18 #[error("HTTP error: {0}")]
20 Http(String),
21
22 #[error("Solver error: {0}")]
24 Solver(String),
25
26 #[error("WASM generation error: {0}")]
28 WasmGeneration(String),
29
30 #[error("Bridge error: {0}")]
32 Bridge(String),
33
34 #[error("Validation error: {0}")]
36 Validation(String),
37
38 #[error("Configuration error: {0}")]
40 Configuration(String),
41
42 #[error("Service error: {0}")]
44 Service(String),
45
46 #[error("IO error: {0}")]
48 Io(#[from] std::io::Error),
49
50 #[error("{0}")]
52 Other(String),
53}
54
55impl From<serde_json::Error> for SolverForgeError {
56 fn from(err: serde_json::Error) -> Self {
57 SolverForgeError::Serialization(err.to_string())
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 #[test]
66 fn test_error_display() {
67 let err = SolverForgeError::Serialization("invalid json".to_string());
68 assert_eq!(err.to_string(), "Serialization error: invalid json");
69
70 let err = SolverForgeError::Validation("missing solution class".to_string());
71 assert_eq!(err.to_string(), "Validation error: missing solution class");
72 }
73
74 #[test]
75 fn test_io_error_conversion() {
76 let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file not found");
77 let err: SolverForgeError = io_err.into();
78 assert!(matches!(err, SolverForgeError::Io(_)));
79 }
80
81 #[test]
82 fn test_json_error_conversion() {
83 let json_result: Result<i32, _> = serde_json::from_str("not json");
84 let err: SolverForgeError = json_result.unwrap_err().into();
85 assert!(matches!(err, SolverForgeError::Serialization(_)));
86 }
87
88 #[test]
89 fn test_result_type() {
90 fn returns_result() -> SolverForgeResult<i32> {
91 Ok(42)
92 }
93 assert_eq!(returns_result().unwrap(), 42);
94
95 fn returns_error() -> SolverForgeResult<i32> {
96 Err(SolverForgeError::Other("test error".to_string()))
97 }
98 assert!(returns_error().is_err());
99 }
100}