diff --git a/src/logic/search.rs b/src/logic/search.rs index 4827ab8..e0412df 100644 --- a/src/logic/search.rs +++ b/src/logic/search.rs @@ -6,6 +6,7 @@ use crate::{ use scraper::Html; pub mod character; +pub mod free_company; selectors!( PAGINATION_TOTAL => ".parts__total"; diff --git a/src/models.rs b/src/models.rs index 363dadb..e59f2d9 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,7 +1,7 @@ macro_rules! ffxiv_enum { ($(#[$meta:meta])* $name:ident { $($variant:ident => $str_repr:expr),+$(,)? }) => { $(#[$meta])* - #[derive(Debug, Serialize)] + #[derive(Debug, Serialize, Deserialize)] pub enum $name { $($variant,)+ } diff --git a/src/models/character.rs b/src/models/character.rs index d57f63b..e7f5fb7 100644 --- a/src/models/character.rs +++ b/src/models/character.rs @@ -2,7 +2,7 @@ use super::GrandCompany; use ffxiv_types::{World, Race, Clan, Guardian}; -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct Character { pub id: u64, @@ -23,7 +23,7 @@ pub struct Character { pub profile_text: String, } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct GrandCompanyInfo { pub grand_company: GrandCompany, pub rank: String, diff --git a/src/models/free_company.rs b/src/models/free_company.rs index 13ec68d..b12dba3 100644 --- a/src/models/free_company.rs +++ b/src/models/free_company.rs @@ -8,13 +8,13 @@ use url::Url; use std::collections::BTreeMap; -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct FreeCompany { pub id: u64, pub name: String, pub world: World, pub slogan: String, - #[serde(serialize_with = "multi_url")] + #[serde(with = "multi_url")] pub crest: Vec, pub grand_company: GrandCompany, pub active_members: u16, @@ -25,27 +25,42 @@ pub struct FreeCompany { pub reputation: BTreeMap, } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct PvpRankings { pub weekly: Option, pub monthly: Option, } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct Estate { pub name: String, pub address: String, pub greeting: String, } -fn multi_url(urls: &Vec, serializer: S) -> Result - where S: serde::Serializer, -{ - use serde::ser::SerializeSeq; +mod multi_url { + use serde::{Deserializer, Deserialize, Serializer, ser::SerializeSeq}; - let mut seq = serializer.serialize_seq(Some(urls.len()))?; - for url in urls { - seq.serialize_element(&url_serde::Ser::new(url))?; + use url::Url; + + crate fn serialize(urls: &Vec, serializer: S) -> Result + where S: Serializer, + { + let mut seq = serializer.serialize_seq(Some(urls.len()))?; + for url in urls { + seq.serialize_element(&url_serde::Ser::new(url))?; + } + seq.end() + } + + crate fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where D: Deserializer<'de> + { + + #[derive(Deserialize)] + struct Wrapper(#[serde(with = "url_serde")] Url); + + let urls = Vec::deserialize(deserializer)?; + Ok(urls.into_iter().map(|Wrapper(u)| u).collect()) } - seq.end() } diff --git a/src/models/search.rs b/src/models/search.rs index 792f269..0c5bfac 100644 --- a/src/models/search.rs +++ b/src/models/search.rs @@ -1,13 +1,14 @@ pub mod character; +pub mod free_company; -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct Pagination { pub current_page: u64, pub total_pages: u64, pub total_results: u64, } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct Paginated { pub pagination: Pagination, pub results: Vec, diff --git a/src/models/search/character.rs b/src/models/search/character.rs index 5fa3cba..9a98972 100644 --- a/src/models/search/character.rs +++ b/src/models/search/character.rs @@ -4,7 +4,7 @@ use ffxiv_types::World; use url::Url; -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct CharacterSearchItem { pub id: u64, pub name: String,