openai_tools/common/
errors.rs1use 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 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 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}