solverforge_core/
error.rs

1//! Error types for SolverForge Core
2//!
3//! This module defines the error types used throughout the SolverForge library.
4//! All errors use the [`SolverForgeError`] enum, which provides specific variants
5//! for different error categories.
6
7use thiserror::Error;
8
9pub type SolverForgeResult<T> = Result<T, SolverForgeError>;
10
11/// Main error type for SolverForge operations
12#[derive(Error, Debug)]
13pub enum SolverForgeError {
14    /// Error during serialization/deserialization
15    #[error("Serialization error: {0}")]
16    Serialization(String),
17
18    /// Error during HTTP communication with solver service
19    #[error("HTTP error: {0}")]
20    Http(String),
21
22    /// Error from the solver service
23    #[error("Solver error: {0}")]
24    Solver(String),
25
26    /// Error during WASM generation
27    #[error("WASM generation error: {0}")]
28    WasmGeneration(String),
29
30    /// Error from the language bridge
31    #[error("Bridge error: {0}")]
32    Bridge(String),
33
34    /// Domain model validation error
35    #[error("Validation error: {0}")]
36    Validation(String),
37
38    /// Configuration error
39    #[error("Configuration error: {0}")]
40    Configuration(String),
41
42    /// Service lifecycle error (starting/stopping embedded service)
43    #[error("Service error: {0}")]
44    Service(String),
45
46    /// IO error
47    #[error("IO error: {0}")]
48    Io(#[from] std::io::Error),
49
50    /// Generic error with message
51    #[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}