diff --git a/src/builder/character_search.rs b/src/builder/character_search.rs index c7fd855..0fca44b 100644 --- a/src/builder/character_search.rs +++ b/src/builder/character_search.rs @@ -86,12 +86,7 @@ impl<'a> CharacterSearchBuilder<'a> { } pub fn send(&self) -> Result> { - let text = self.scraper.client - .get(self.as_url()) - .send() - .map_err(Error::Net)? - .text() - .map_err(Error::Net)?; + let text = self.scraper.text(self.as_url())?; lodestone_parser::parse_character_search(&text).map_err(Error::Parse) } diff --git a/src/builder/free_company_search.rs b/src/builder/free_company_search.rs index a664929..2058722 100644 --- a/src/builder/free_company_search.rs +++ b/src/builder/free_company_search.rs @@ -58,12 +58,7 @@ impl<'a> FreeCompanySearchBuilder<'a> { } pub fn send(&self) -> Result> { - let text = self.scraper.client - .get(self.as_url()) - .send() - .map_err(Error::Net)? - .text() - .map_err(Error::Net)?; + let text = self.scraper.text(self.as_url())?; lodestone_parser::parse_free_company_search(&text).map_err(Error::Parse) } diff --git a/src/error.rs b/src/error.rs index 3785e8d..ed8cf8a 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,7 +1,13 @@ +use reqwest::StatusCode; + pub type Result = std::result::Result; #[derive(Debug, Fail)] pub enum Error { + #[fail(display = "not found")] + NotFound, + #[fail(display = "Lodestone responded with an unexpected code: {}", _0)] + UnexpectedResponse(StatusCode), #[fail(display = "network error: {}", _0)] Net(reqwest::Error), #[fail(display = "url parse error: {}", _0)] diff --git a/src/lib.rs b/src/lib.rs index 2c9e431..74a1d8e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,7 +7,7 @@ use lodestone_parser::models::{ free_company::FreeCompany, }; -use reqwest::Client; +use reqwest::{Client, StatusCode}; use url::Url; @@ -41,14 +41,24 @@ impl LodestoneScraper { LODESTONE_URL.join(s).map_err(Error::Url) } - pub fn character(&self, id: u64) -> Result { - let url = LodestoneScraper::route(&format!("character/{}", id))?; - let text = self.client + crate fn text(&self, url: Url) -> Result { + let mut res = self.client .get(url) .send() - .map_err(Error::Net)? - .text() .map_err(Error::Net)?; + match res.status() { + StatusCode::Ok => {}, + StatusCode::NotFound => return Err(Error::NotFound), + x => return Err(Error::UnexpectedResponse(x)), + } + res + .text() + .map_err(Error::Net) + } + + pub fn character(&self, id: u64) -> Result { + let url = LodestoneScraper::route(&format!("character/{}", id))?; + let text = self.text(url)?; lodestone_parser::parse_character(id, &text).map_err(Error::Parse) } @@ -58,12 +68,7 @@ impl LodestoneScraper { pub fn free_company(&self, id: u64) -> Result { let url = LodestoneScraper::route(&format!("freecompany/{}", id))?; - let text = self.client - .get(url) - .send() - .map_err(Error::Net)? - .text() - .map_err(Error::Net)?; + let text = self.text(url)?; lodestone_parser::parse_free_company(id, &text).map_err(Error::Parse) }