Skip to main content

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!(error_resp.error.message, Some("Incorrect API key provided".to_string()));
52        assert_eq!(error_resp.error.code, Some("invalid_api_key".to_string()));
53    }
54
55    #[test]
56    fn test_error_response_rate_limit() {
57        let json = r#"{
58            "error": {
59                "message": "Rate limit exceeded",
60                "type": "rate_limit_error",
61                "param": null,
62                "code": "rate_limit_exceeded"
63            }
64        }"#;
65
66        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
67        assert_eq!(error_resp.error.message, Some("Rate limit exceeded".to_string()));
68        assert_eq!(error_resp.error.code, Some("rate_limit_exceeded".to_string()));
69    }
70
71    #[test]
72    fn test_error_response_with_missing_fields() {
73        let json = r#"{"error": {"message": "Error occurred"}}"#;
74
75        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
76        assert_eq!(error_resp.error.message, Some("Error occurred".to_string()));
77        assert!(error_resp.error.code.is_none());
78        assert!(error_resp.error.param.is_none());
79        assert!(error_resp.error.type_name.is_none());
80    }
81
82    #[test]
83    fn test_error_response_empty_error() {
84        let json = r#"{"error": {}}"#;
85
86        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
87        assert!(error_resp.error.message.is_none());
88        assert!(error_resp.error.code.is_none());
89    }
90
91    #[test]
92    fn test_error_response_with_param() {
93        let json = r#"{
94            "error": {
95                "message": "Invalid value for 'model'",
96                "type": "invalid_request_error",
97                "param": "model",
98                "code": null
99            }
100        }"#;
101
102        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
103        assert_eq!(error_resp.error.message, Some("Invalid value for 'model'".to_string()));
104        assert_eq!(error_resp.error.param, Some("model".to_string()));
105        assert!(error_resp.error.code.is_none());
106    }
107
108    #[test]
109    fn test_error_message_unwrap_or_default() {
110        // Test that unwrap_or_default works correctly for None case
111        let json = r#"{"error": {}}"#;
112        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
113        let message = error_resp.error.message.unwrap_or_default();
114        assert_eq!(message, "");
115
116        // Test that unwrap_or_default works correctly for Some case
117        let json = r#"{"error": {"message": "Test error"}}"#;
118        let error_resp: ErrorResponse = serde_json::from_str(json).unwrap();
119        let message = error_resp.error.message.unwrap_or_default();
120        assert_eq!(message, "Test error");
121    }
122}