Merge pull request 'Implement Error parsing for API responses' (#18) from BlankParenthesis/hopper:handle-status-errors into main
fixes #20
This commit is contained in:
commit
5ae5aa668d
16
src/api.rs
16
src/api.rs
|
@ -1,6 +1,6 @@
|
||||||
use console::style;
|
use console::style;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use std::collections::HashMap;
|
use std::{collections::HashMap, fmt};
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
pub struct SearchResponse {
|
pub struct SearchResponse {
|
||||||
|
@ -140,3 +140,17 @@ pub struct ModVersionFile {
|
||||||
pub primary: bool,
|
pub primary: bool,
|
||||||
pub size: isize,
|
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 {}
|
||||||
|
|
|
@ -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 crate::config::{Args, Config, PackageType, SearchArgs};
|
||||||
use futures_util::StreamExt;
|
use futures_util::StreamExt;
|
||||||
use log::*;
|
use log::*;
|
||||||
|
@ -58,14 +58,13 @@ impl HopperClient {
|
||||||
|
|
||||||
let url = reqwest::Url::parse_with_params(url.as_str(), ¶ms)?;
|
let url = reqwest::Url::parse_with_params(url.as_str(), ¶ms)?;
|
||||||
info!("GET {}", url);
|
info!("GET {}", url);
|
||||||
let response = self
|
let response = self.client.get(url).send().await?;
|
||||||
.client
|
|
||||||
.get(url)
|
if response.status().is_success() {
|
||||||
.send()
|
Ok(response.json::<SearchResponse>().await?)
|
||||||
.await?
|
} else {
|
||||||
.json::<SearchResponse>()
|
Err(response.json::<APIError>().await?.into())
|
||||||
.await?;
|
}
|
||||||
Ok(response)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn fetch_mod_info(&self, mod_result: &ModResult) -> anyhow::Result<ModInfo> {
|
pub async fn fetch_mod_info(&self, mod_result: &ModResult) -> anyhow::Result<ModInfo> {
|
||||||
|
@ -81,8 +80,12 @@ impl HopperClient {
|
||||||
);
|
);
|
||||||
info!("GET {}", url);
|
info!("GET {}", url);
|
||||||
let response = self.client.get(url).send().await?;
|
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> {
|
pub async fn fetch_mod_version(&self, version_id: &String) -> anyhow::Result<ModVersion> {
|
||||||
|
@ -94,8 +97,12 @@ impl HopperClient {
|
||||||
);
|
);
|
||||||
info!("GET {}", url);
|
info!("GET {}", url);
|
||||||
let response = self.client.get(url).send().await?;
|
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(
|
pub async fn download_version_file(
|
||||||
|
@ -122,6 +129,11 @@ impl HopperClient {
|
||||||
let url = &file.url;
|
let url = &file.url;
|
||||||
info!("GET {}", url);
|
info!("GET {}", url);
|
||||||
let response = self.client.get(url).send().await?;
|
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();
|
let total_size = response.content_length().unwrap();
|
||||||
|
|
||||||
// TODO better colors and styling!
|
// TODO better colors and styling!
|
||||||
|
|
Loading…
Reference in New Issue