diff --git a/src/builder.rs b/src/builder.rs index 180fd76..0d10481 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -1,5 +1,9 @@ pub mod character_search; pub mod free_company_search; +pub mod linkshell_search; +pub mod linkshell; pub use self::character_search::CharacterSearchBuilder; pub use self::free_company_search::FreeCompanySearchBuilder; +pub use self::linkshell_search::LinkshellSearchBuilder; +pub use self::linkshell::LinkshellBuilder; diff --git a/src/builder/linkshell.rs b/src/builder/linkshell.rs new file mode 100644 index 0000000..dfe9e7c --- /dev/null +++ b/src/builder/linkshell.rs @@ -0,0 +1,52 @@ +use crate::{ + LodestoneScraper, + error::*, +}; + +use ffxiv_types::{World, DataCenter}; + +use lodestone_parser::models::linkshell::Linkshell; + +use url::Url; + +#[derive(Debug)] +pub struct LinkshellBuilder<'a> { + scraper: &'a LodestoneScraper, + id: u64, + // page + page: Option, +} + +impl<'a> LinkshellBuilder<'a> { + pub fn new(scraper: &'a LodestoneScraper, id: u64) -> Self { + LinkshellBuilder { + scraper, + id, + page: None, + } + } + + pub fn page(&mut self, p: u64) -> &mut Self { + self.page = Some(p); + self + } + + pub fn send(&self) -> Result { + let text = self.scraper.text(self.as_url())?; + lodestone_parser::parse_linkshell(self.id, &text).map_err(Error::Parse) + } + + pub fn as_url(&self) -> Url { + let mut url = LodestoneScraper::route(&format!("linkshell/{}", self.id)).unwrap(); + + { + let mut pairs = url.query_pairs_mut(); + + if let Some(page) = self.page { + pairs.append_pair("page", &page.to_string()); + } + } + + url + } +} diff --git a/src/builder/linkshell_search.rs b/src/builder/linkshell_search.rs new file mode 100644 index 0000000..e3b40d1 --- /dev/null +++ b/src/builder/linkshell_search.rs @@ -0,0 +1,86 @@ +use crate::{ + LodestoneScraper, + error::*, + util::{Either, AsLodestone}, +}; + +use ffxiv_types::{World, DataCenter}; + +use lodestone_parser::models::search::{ + Paginated, + linkshell::LinkshellSearchItem, +}; + +use url::Url; + +#[derive(Debug)] +pub struct LinkshellSearchBuilder<'a> { + scraper: &'a LodestoneScraper, + // q + name: Option<&'a str>, + // worldname + world: Option>, + // FIXME: add active members + // page + page: Option, +} + +impl<'a> LinkshellSearchBuilder<'a> { + pub fn new(scraper: &'a LodestoneScraper) -> Self { + LinkshellSearchBuilder { + scraper, + name: None, + world: None, + page: None, + } + } + + pub fn name(&mut self, n: &'a str) -> &mut Self { + self.name = Some(n); + self + } + + pub fn world(&mut self, w: World) -> &mut Self { + self.world = Some(Either::Left(w)); + self + } + + pub fn data_center(&mut self, dc: DataCenter) -> &mut Self { + self.world = Some(Either::Right(dc)); + self + } + + pub fn page(&mut self, p: u64) -> &mut Self { + self.page = Some(p); + self + } + + pub fn send(&self) -> Result> { + let text = self.scraper.text(self.as_url())?; + lodestone_parser::parse_linkshell_search(&text).map_err(Error::Parse) + } + + pub fn as_url(&self) -> Url { + let mut url = crate::LODESTONE_URL.join("linkshell/").unwrap(); + + { + let mut pairs = url.query_pairs_mut(); + + if let Some(page) = self.page { + pairs.append_pair("page", &page.to_string()); + } + + if let Some(ref name) = self.name { + pairs.append_pair("q", name); + } + + match self.world { + Some(Either::Left(w)) => { pairs.append_pair("worldname", w.as_str()); }, + Some(Either::Right(dc)) => { pairs.append_pair("worldname", &dc.as_lodestone()); }, + _ => {}, + } + } + + url + } +} diff --git a/src/lib.rs b/src/lib.rs index 85e62e6..f51f047 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,6 +7,7 @@ use lazy_static::lazy_static; use lodestone_parser::models::{ character::Character, free_company::FreeCompany, + linkshell::Linkshell, }; use reqwest::{Client, StatusCode}; @@ -77,4 +78,12 @@ impl LodestoneScraper { pub fn free_company_search(&self) -> builder::FreeCompanySearchBuilder { builder::FreeCompanySearchBuilder::new(self) } + + pub fn linkshell(&self, id: u64) -> builder::LinkshellBuilder { + builder::LinkshellBuilder::new(self, id) + } + + pub fn linkshell_search(&self) -> builder::LinkshellSearchBuilder { + builder::LinkshellSearchBuilder::new(self) + } }