diff --git a/src/api.rs b/src/api.rs index 346ebe9..07c1cfe 100644 --- a/src/api.rs +++ b/src/api.rs @@ -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 {} diff --git a/src/client.rs b/src/client.rs index 6bba001..5959698 100644 --- a/src/client.rs +++ b/src/client.rs @@ -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::*; @@ -58,14 +58,13 @@ impl HopperClient { let url = reqwest::Url::parse_with_params(url.as_str(), ¶ms)?; info!("GET {}", url); - let response = self - .client - .get(url) - .send() - .await? - .json::() - .await?; - Ok(response) + let response = self.client.get(url).send().await?; + + if response.status().is_success() { + Ok(response.json::().await?) + } else { + Err(response.json::().await?.into()) + } } pub async fn fetch_mod_info(&self, mod_result: &ModResult) -> anyhow::Result { @@ -81,8 +80,12 @@ impl HopperClient { ); info!("GET {}", url); let response = self.client.get(url).send().await?; - let response = response.json::().await?; - Ok(response) + + if response.status().is_success() { + Ok(response.json::().await?) + } else { + Err(response.json::().await?.into()) + } } pub async fn fetch_mod_version(&self, version_id: &String) -> anyhow::Result { @@ -94,8 +97,12 @@ impl HopperClient { ); info!("GET {}", url); let response = self.client.get(url).send().await?; - let response = response.json::().await?; - Ok(response) + + if response.status().is_success() { + Ok(response.json::().await?) + } else { + Err(response.json::().await?.into()) + } } pub async fn download_version_file( @@ -122,6 +129,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::().await?.into()) + } + let total_size = response.content_length().unwrap(); // TODO better colors and styling!