Skip to content

Commit

Permalink
fix: panic when check api error (#520)
Browse files Browse the repository at this point in the history
  • Loading branch information
sigoden committed May 18, 2024
1 parent d16cca2 commit 31977f9
Showing 1 changed file with 26 additions and 4 deletions.
30 changes: 26 additions & 4 deletions src/client/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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);
Expand Down

0 comments on commit 31977f9

Please sign in to comment.