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!(
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 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 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}