aboutsummaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/api')
-rw-r--r--src/api/mod.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/api/mod.rs b/src/api/mod.rs
index 9c771fd..c33e6ba 100644
--- a/src/api/mod.rs
+++ b/src/api/mod.rs
@@ -16,7 +16,7 @@ pub use self::{
use image::DynamicImage;
use itertools::Itertools;
-use reqwest::{Client, Url};
+use reqwest::{Client, StatusCode, Url};
use serde::{de::DeserializeOwned, Serialize};
use std::path::Path;
@@ -28,6 +28,7 @@ const BASE_URL: &str = "https://api.guildwars2.com/v2/";
quick_error! {
#[derive(Debug)]
pub enum ApiError {
+ ItemNotFound {}
SerializationError(err: serde_json::Error) {
cause(err)
from()
@@ -47,6 +48,23 @@ quick_error! {
}
}
+trait ApiResponse
+where
+ Self: Sized,
+{
+ fn ensure_found(self) -> Result<Self, ApiError>;
+}
+
+impl ApiResponse for reqwest::Response {
+ fn ensure_found(self) -> Result<Self, ApiError> {
+ if self.status() == StatusCode::PARTIAL_CONTENT || self.status() == StatusCode::NOT_FOUND {
+ Err(ApiError::ItemNotFound)
+ } else {
+ Ok(self)
+ }
+ }
+}
+
/// Trait for API objects that have an ID.
///
/// This is used by [`Api`](struct.Api.html) to properly retrieve and cache objects.
@@ -143,6 +161,7 @@ impl Api {
.get(url)
.query(&[("ids", api_arg)])
.send()?
+ .ensure_found()?
.json()?;
for result in &resp {
let cache_path = format!("{}{}", cache_prefix, result.get_id().to_string());