summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2024-05-18 22:41:27 +0800
committerGitHub <noreply@github.com>2024-05-18 22:41:27 +0800
commit31977f9642d61885543da109dc3f7972bf3250f7 (patch)
treee8b19e5a8714568cbab1a4d8051ad3041f8c7ebc /src
parentd16cca23acf2bcae05cecdb2f6bf85fe3b7cb1cb (diff)
downloadaichat-31977f9642d61885543da109dc3f7972bf3250f7.tar.gz
fix: panic when check api error (#520)
Diffstat (limited to 'src')
-rw-r--r--src/client/common.rs30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/client/common.rs b/src/client/common.rs
index 4ef276d..73ed40a 100644
--- a/src/client/common.rs
+++ b/src/client/common.rs
@@ -482,16 +482,24 @@ pub fn catch_error(data: &Value, status: u16) -> Result<()> {
}
debug!("Invalid response, status: {status}, data: {data}");
if let Some(error) = data["error"].as_object() {
- if let (Some(typ), Some(message)) = (error["type"].as_str(), error["message"].as_str()) {
+ if let (Some(typ), Some(message)) = (
+ get_str_field_from_json_map(error, "type"),
+ get_str_field_from_json_map(error, "message"),
+ ) {
bail!("{message} (type: {typ})");
}
} else if let Some(error) = data["errors"][0].as_object() {
- if let (Some(code), Some(message)) = (error["code"].as_u64(), error["message"].as_str()) {
+ if let (Some(code), Some(message)) = (
+ get_u64_field_from_json_map(error, "code"),
+ get_str_field_from_json_map(error, "message"),
+ ) {
bail!("{message} (status: {code})")
}
} else if let Some(error) = data[0]["error"].as_object() {
- if let (Some(status), Some(message)) = (error["status"].as_str(), error["message"].as_str())
- {
+ if let (Some(status), Some(message)) = (
+ get_str_field_from_json_map(error, "status"),
+ get_str_field_from_json_map(error, "message"),
+ ) {
bail!("{message} (status: {status})")
}
} else if let (Some(detail), Some(status)) = (data["detail"].as_str(), data["status"].as_i64())
@@ -505,6 +513,20 @@ pub fn catch_error(data: &Value, status: u16) -> Result<()> {
bail!("Invalid response data: {data} (status: {status})");
}
+pub fn get_str_field_from_json_map<'a>(
+ map: &'a serde_json::Map<String, Value>,
+ field_name: &str,
+) -> Option<&'a str> {
+ map.get(field_name).and_then(|v| v.as_str())
+}
+
+pub fn get_u64_field_from_json_map(
+ map: &serde_json::Map<String, Value>,
+ field_name: &str,
+) -> Option<u64> {
+ map.get(field_name).and_then(|v| v.as_u64())
+}
+
pub fn maybe_catch_error(data: &Value) -> Result<()> {
if let (Some(code), Some(message)) = (data["code"].as_str(), data["message"].as_str()) {
debug!("Invalid response: {}", data);