diff --git a/src/types/entities/user.rs b/src/types/entities/user.rs index ddbdc22..d547be3 100644 --- a/src/types/entities/user.rs +++ b/src/types/entities/user.rs @@ -155,8 +155,9 @@ impl Serialize for UserFlags { impl<'de> Deserialize<'de> for UserFlags { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de> { - let s = String::deserialize(deserializer)?.parse::().map_err(serde::de::Error::custom)?; - + // let s = String::deserialize(deserializer)?.parse::().map_err(serde::de::Error::custom)?; + let s = crate::types::serde::string_or_u64(deserializer)?; + Ok(UserFlags::from_bits(s).unwrap()) } } diff --git a/src/types/utils/serde.rs b/src/types/utils/serde.rs index 8584004..544a305 100644 --- a/src/types/utils/serde.rs +++ b/src/types/utils/serde.rs @@ -1,6 +1,7 @@ use core::fmt; use chrono::{LocalResult, NaiveDateTime}; -use serde::de; +use serde::{de, Deserialize, Deserializer}; +use serde::de::Error; #[doc(hidden)] #[derive(Debug)] @@ -259,4 +260,19 @@ pub(crate) fn serde_from(me: LocalResult, _ts: &V) -> Result } LocalResult::Single(val) => Ok(val), } +} + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(untagged)] +enum StringOrU64 { + String(String), + U64(u64), +} + +pub fn string_or_u64<'de, D>(d: D) -> Result +where D: Deserializer<'de> { + match StringOrU64::deserialize(d)? { + StringOrU64::String(s) => s.parse::().map_err(D::Error::custom), + StringOrU64::U64(u) => Ok(u) + } } \ No newline at end of file