diff options
author | Daniel Schadt <kingdread@gmx.de> | 2019-12-12 01:25:28 +0100 |
---|---|---|
committer | Daniel Schadt <kingdread@gmx.de> | 2019-12-12 01:25:28 +0100 |
commit | a6afa81d1d9f2dd7d10fe7c0555ae8a8a6d84867 (patch) | |
tree | f82d523b2c3381d58af1283be6a01321fb4b0fa2 /src/api/mod.rs | |
parent | 5350b4ece04082bf8a0a127c230669c4de9b7cc4 (diff) | |
download | kondou-a6afa81d1d9f2dd7d10fe7c0555ae8a8a6d84867.tar.gz kondou-a6afa81d1d9f2dd7d10fe7c0555ae8a8a6d84867.tar.bz2 kondou-a6afa81d1d9f2dd7d10fe7c0555ae8a8a6d84867.zip |
use helper traits for better code
Diffstat (limited to 'src/api/mod.rs')
-rw-r--r-- | src/api/mod.rs | 21 |
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()); |