Skip to main content

qwencode_rs/types/
error.rs

1use thiserror::Error;
2
3/// Represents errors that can occur during SDK operations
4#[derive(Debug, Error)]
5pub enum SDKError {
6    #[error("Transport error: {0}")]
7    Transport(String),
8
9    #[error("Session error: {0}")]
10    Session(String),
11
12    #[error("Invalid configuration: {0}")]
13    InvalidConfig(String),
14
15    #[error("MCP error: {0}")]
16    Mcp(String),
17
18    #[error("Tool execution error: {0}")]
19    ToolExecution(String),
20
21    #[error(transparent)]
22    Other(#[from] anyhow::Error),
23}
24
25/// Error returned when an operation is aborted
26#[derive(Debug, Error)]
27#[error("Operation was aborted")]
28pub struct AbortError;
29
30impl Default for AbortError {
31    fn default() -> Self {
32        Self::new()
33    }
34}
35
36impl AbortError {
37    pub fn new() -> Self {
38        AbortError
39    }
40}
41
42impl PartialEq for AbortError {
43    fn eq(&self, _: &Self) -> bool {
44        true
45    }
46}
47
48/// Check if an error is an abort error
49pub fn is_abort_error(err: &anyhow::Error) -> bool {
50    err.downcast_ref::<AbortError>().is_some()
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn test_abort_error_creation() {
59        let err = AbortError::new();
60        assert!(format!("{}", err).contains("aborted"));
61    }
62
63    #[test]
64    fn test_abort_error_equality() {
65        let err1 = AbortError::new();
66        let err2 = AbortError::new();
67        assert_eq!(err1, err2);
68    }
69
70    #[test]
71    fn test_is_abort_error_true() {
72        let _err: Box<dyn std::error::Error> = Box::new(AbortError::new());
73        // Note: This test will need adjustment based on how we box errors
74        // For now, testing the function exists and compiles
75    }
76
77    #[test]
78    fn test_sdk_error_transport_variant() {
79        let err = SDKError::Transport("connection failed".to_string());
80        assert!(format!("{}", err).contains("Transport"));
81        assert!(format!("{}", err).contains("connection failed"));
82    }
83
84    #[test]
85    fn test_sdk_error_session_variant() {
86        let err = SDKError::Session("session closed".to_string());
87        assert!(format!("{}", err).contains("Session"));
88        assert!(format!("{}", err).contains("session closed"));
89    }
90
91    #[test]
92    fn test_sdk_error_invalid_config_variant() {
93        let err = SDKError::InvalidConfig("missing model".to_string());
94        assert!(format!("{}", err).contains("Invalid configuration"));
95        assert!(format!("{}", err).contains("missing model"));
96    }
97
98    #[test]
99    fn test_sdk_error_mcp_variant() {
100        let err = SDKError::Mcp("server unavailable".to_string());
101        assert!(format!("{}", err).contains("MCP"));
102        assert!(format!("{}", err).contains("server unavailable"));
103    }
104
105    #[test]
106    fn test_sdk_error_tool_execution_variant() {
107        let err = SDKError::ToolExecution("tool not found".to_string());
108        assert!(format!("{}", err).contains("Tool execution"));
109        assert!(format!("{}", err).contains("tool not found"));
110    }
111
112    #[test]
113    fn test_sdk_error_debug_format() {
114        let err = SDKError::Transport("test".to_string());
115        let debug_str = format!("{:?}", err);
116        assert!(debug_str.contains("Transport"));
117    }
118}