Implement Error parsing for API responses

This commit is contained in:
[ ] 2022-12-09 05:45:46 +00:00
parent 74de0d15b3
commit 552d75cbff
2 changed files with 40 additions and 14 deletions

View File

@ -1,6 +1,6 @@
use console::style;
use serde::Deserialize;
use std::collections::HashMap;
use std::{collections::HashMap, fmt};
#[derive(Deserialize, Debug)]
pub struct SearchResponse {
@ -140,3 +140,17 @@ pub struct ModVersionFile {
pub primary: bool,
pub size: isize,
}
#[derive(Deserialize, Debug)]
pub struct Error {
pub error: String,
pub description: String,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}: {}", self.error, self.description)
}
}
impl std::error::Error for Error {}

View File

@ -1,4 +1,4 @@
use crate::api::{ModInfo, ModResult, ModVersion, ModVersionFile, SearchResponse};
use crate::api::{ModInfo, ModResult, ModVersion, ModVersionFile, SearchResponse, Error as APIError};
use crate::config::{Args, Config, PackageType, SearchArgs};
use futures_util::StreamExt;
use log::*;
@ -55,14 +55,13 @@ impl HopperClient {
let url = reqwest::Url::parse_with_params(url.as_str(), &params)?;
info!("GET {}", url);
let response = self
.client
.get(url)
.send()
.await?
.json::<SearchResponse>()
.await?;
Ok(response)
let response = self.client.get(url).send().await?;
if response.status().is_success() {
Ok(response.json::<SearchResponse>().await?)
} else {
Err(response.json::<APIError>().await?.into())
}
}
pub async fn fetch_mod_info(&self, mod_result: &ModResult) -> anyhow::Result<ModInfo> {
@ -78,8 +77,12 @@ impl HopperClient {
);
info!("GET {}", url);
let response = self.client.get(url).send().await?;
let response = response.json::<ModInfo>().await?;
Ok(response)
if response.status().is_success() {
Ok(response.json::<ModInfo>().await?)
} else {
Err(response.json::<APIError>().await?.into())
}
}
pub async fn fetch_mod_version(&self, version_id: &String) -> anyhow::Result<ModVersion> {
@ -91,8 +94,12 @@ impl HopperClient {
);
info!("GET {}", url);
let response = self.client.get(url).send().await?;
let response = response.json::<ModVersion>().await?;
Ok(response)
if response.status().is_success() {
Ok(response.json::<ModVersion>().await?)
} else {
Err(response.json::<APIError>().await?.into())
}
}
pub async fn download_version_file(
@ -119,6 +126,11 @@ impl HopperClient {
let url = &file.url;
info!("GET {}", url);
let response = self.client.get(url).send().await?;
if !response.status().is_success() {
return Err(response.json::<APIError>().await?.into())
}
let total_size = response.content_length().unwrap();
// TODO better colors and styling!