openai_tools/common/
errors.rs

1use serde::Deserialize;
2use thiserror::Error;
3
4#[derive(Error, Debug)]
5pub enum OpenAIToolError {
6    #[error("Request error: {0}")]
7    RequestError(#[from] request::Error),
8    #[error("JSON serialization/deserialization error: {0}")]
9    SerdeJsonError(#[from] serde_json::Error),
10    #[error("Error from anyhow: {0}")]
11    AnyhowError(#[from] anyhow::Error),
12    #[error("WebSocket error: {0}")]
13    WebSocketError(String),
14    #[error("Realtime API error: {code} - {message}")]
15    RealtimeError { code: String, message: String },
16    #[error("Error: {0}")]
17    Error(String),
18}
19
20pub type Result<T> = std::result::Result<T, OpenAIToolError>;
21
22#[derive(Debug, Clone, Default, Deserialize)]
23pub struct ErrorMessage {
24    pub message: Option<String>,
25    pub type_name: Option<String>,
26    pub param: Option<String>,
27    pub code: Option<String>,
28}
29
30#[derive(Debug, Clone, Default, Deserialize)]
31pub struct ErrorResponse {
32    pub error: ErrorMessage,
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    #[test]
40    fn test_error_response_deserialization() {
41        let json = r#"{
42            "error": {
43                "message": "Incorrect API key provided",
44                "type": "invalid_request_error",
45                "param": null,
46                "code": "invalid_api_key"
47            }
48        }"#;
49
50        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
51        assert_eq!(
52            error_resp.error.message,
53            Some("Incorrect API key provided".to_string())
54        );
55        assert_eq!(
56            error_resp.error.code,
57            Some("invalid_api_key".to_string())
58        );
59    }
60
61    #[test]
62    fn test_error_response_rate_limit() {
63        let json = r#"{
64            "error": {
65                "message": "Rate limit exceeded",
66                "type": "rate_limit_error",
67                "param": null,
68                "code": "rate_limit_exceeded"
69            }
70        }"#;
71
72        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
73        assert_eq!(
74            error_resp.error.message,
75            Some("Rate limit exceeded".to_string())
76        );
77        assert_eq!(
78            error_resp.error.code,
79            Some("rate_limit_exceeded".to_string())
80        );
81    }
82
83    #[test]
84    fn test_error_response_with_missing_fields() {
85        let json = r#"{"error": {"message": "Error occurred"}}"#;
86
87        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
88        assert_eq!(
89            error_resp.error.message,
90            Some("Error occurred".to_string())
91        );
92        assert!(error_resp.error.code.is_none());
93        assert!(error_resp.error.param.is_none());
94        assert!(error_resp.error.type_name.is_none());
95    }
96
97    #[test]
98    fn test_error_response_empty_error() {
99        let json = r#"{"error": {}}"#;
100
101        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
102        assert!(error_resp.error.message.is_none());
103        assert!(error_resp.error.code.is_none());
104    }
105
106    #[test]
107    fn test_error_response_with_param() {
108        let json = r#"{
109            "error": {
110                "message": "Invalid value for 'model'",
111                "type": "invalid_request_error",
112                "param": "model",
113                "code": null
114            }
115        }"#;
116
117        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
118        assert_eq!(
119            error_resp.error.message,
120            Some("Invalid value for 'model'".to_string())
121        );
122        assert_eq!(error_resp.error.param, Some("model".to_string()));
123        assert!(error_resp.error.code.is_none());
124    }
125
126    #[test]
127    fn test_error_message_unwrap_or_default() {
128        // Test that unwrap_or_default works correctly for None case
129        let json = r#"{"error": {}}"#;
130        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
131        let message = error_resp.error.message.unwrap_or_default();
132        assert_eq!(message, "");
133
134        // Test that unwrap_or_default works correctly for Some case
135        let json = r#"{"error": {"message": "Test error"}}"#;
136        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
137        let message = error_resp.error.message.unwrap_or_default();
138        assert_eq!(message, "Test error");
139    }
140}