From 4da763543ec415ec3e98c2afa647248168586642 Mon Sep 17 00:00:00 2001 From: Anna Date: Thu, 6 Sep 2018 13:48:57 -0400 Subject: [PATCH] fix: represent u64s as strings --- src/models/character.rs | 1 + src/models/free_company.rs | 1 + src/models/search/character.rs | 1 + src/models/search/free_company.rs | 1 + src/util/serde.rs | 2 ++ src/util/serde/opt_u64_str.rs | 24 ++++++++++++++++++++++++ src/util/serde/u64_str.rs | 16 ++++++++++++++++ 7 files changed, 46 insertions(+) create mode 100644 src/util/serde/opt_u64_str.rs create mode 100644 src/util/serde/u64_str.rs diff --git a/src/models/character.rs b/src/models/character.rs index b71001d..d4995f3 100644 --- a/src/models/character.rs +++ b/src/models/character.rs @@ -22,6 +22,7 @@ pub struct Character { pub city_state: CityState, pub grand_company: Option, + #[serde(with = "crate::util::serde::opt_u64_str")] pub free_company_id: Option, pub profile_text: String, diff --git a/src/models/free_company.rs b/src/models/free_company.rs index c1ede91..a4e6d6c 100644 --- a/src/models/free_company.rs +++ b/src/models/free_company.rs @@ -10,6 +10,7 @@ use std::collections::BTreeMap; #[derive(Debug, Serialize, Deserialize)] pub struct FreeCompany { + #[serde(with = "crate::util::serde::u64_str")] pub id: u64, pub name: String, pub world: World, diff --git a/src/models/search/character.rs b/src/models/search/character.rs index 9a98972..27d518c 100644 --- a/src/models/search/character.rs +++ b/src/models/search/character.rs @@ -10,6 +10,7 @@ pub struct CharacterSearchItem { pub name: String, pub world: World, pub grand_company: Option, + #[serde(with = "crate::util::serde::opt_u64_str")] pub free_company_id: Option, #[serde(with = "url_serde")] pub face: Url, diff --git a/src/models/search/free_company.rs b/src/models/search/free_company.rs index 2dd36fc..6de578a 100644 --- a/src/models/search/free_company.rs +++ b/src/models/search/free_company.rs @@ -8,6 +8,7 @@ use url::Url; #[derive(Debug, Serialize, Deserialize)] pub struct FreeCompanySearchItem { + #[serde(with = "crate::util::serde::u64_str")] pub id: u64, pub name: String, pub world: World, diff --git a/src/util/serde.rs b/src/util/serde.rs index e4b2468..798acaa 100644 --- a/src/util/serde.rs +++ b/src/util/serde.rs @@ -1 +1,3 @@ pub mod multi_url; +pub mod opt_u64_str; +pub mod u64_str; diff --git a/src/util/serde/opt_u64_str.rs b/src/util/serde/opt_u64_str.rs new file mode 100644 index 0000000..3a59ef9 --- /dev/null +++ b/src/util/serde/opt_u64_str.rs @@ -0,0 +1,24 @@ +use serde::{Deserializer, Deserialize, Serializer, de::Unexpected}; + +crate fn serialize(u: &Option, serializer: S) -> Result + where S: Serializer, +{ + match *u { + Some(u) => serializer.serialize_u64(u), + None => serializer.serialize_none(), + } +} + +crate fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where D: Deserializer<'de> +{ + let s: Option<&str> = Deserialize::deserialize(deserializer)?; + let s = match s { + Some(s) => s, + None => return Ok(None), + }; + s + .parse() + .map_err(|_| serde::de::Error::invalid_value(Unexpected::Str(s), &"string containing a u64")) + .map(Some) +} diff --git a/src/util/serde/u64_str.rs b/src/util/serde/u64_str.rs new file mode 100644 index 0000000..b096470 --- /dev/null +++ b/src/util/serde/u64_str.rs @@ -0,0 +1,16 @@ +use serde::{Deserializer, Deserialize, Serializer, de::Unexpected}; + +crate fn serialize(u: &u64, serializer: S) -> Result + where S: Serializer, +{ + serializer.serialize_str(&u.to_string()) +} + +crate fn deserialize<'de, D>(deserializer: D) -> Result + where D: Deserializer<'de> +{ + let s: &str = Deserialize::deserialize(deserializer)?; + s + .parse() + .map_err(|_| serde::de::Error::invalid_value(Unexpected::Str(s), &"string containing a u64")) +}