fix: represent u64s as strings

This commit is contained in:
Anna 2018-09-06 13:48:57 -04:00
parent 91269023e9
commit 4da763543e
7 changed files with 46 additions and 0 deletions

View File

@ -22,6 +22,7 @@ pub struct Character {
pub city_state: CityState,
pub grand_company: Option<GrandCompanyInfo>,
#[serde(with = "crate::util::serde::opt_u64_str")]
pub free_company_id: Option<u64>,
pub profile_text: String,

View File

@ -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,

View File

@ -10,6 +10,7 @@ pub struct CharacterSearchItem {
pub name: String,
pub world: World,
pub grand_company: Option<GrandCompanyInfo>,
#[serde(with = "crate::util::serde::opt_u64_str")]
pub free_company_id: Option<u64>,
#[serde(with = "url_serde")]
pub face: Url,

View File

@ -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,

View File

@ -1 +1,3 @@
pub mod multi_url;
pub mod opt_u64_str;
pub mod u64_str;

View File

@ -0,0 +1,24 @@
use serde::{Deserializer, Deserialize, Serializer, de::Unexpected};
crate fn serialize<S>(u: &Option<u64>, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer,
{
match *u {
Some(u) => serializer.serialize_u64(u),
None => serializer.serialize_none(),
}
}
crate fn deserialize<'de, D>(deserializer: D) -> Result<Option<u64>, 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)
}

16
src/util/serde/u64_str.rs Normal file
View File

@ -0,0 +1,16 @@
use serde::{Deserializer, Deserialize, Serializer, de::Unexpected};
crate fn serialize<S>(u: &u64, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer,
{
serializer.serialize_str(&u.to_string())
}
crate fn deserialize<'de, D>(deserializer: D) -> Result<u64, D::Error>
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"))
}