diff options
| author | Zeyla Hellyer <[email protected]> | 2017-04-24 22:51:22 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-04-24 22:51:22 -0700 |
| commit | 6aeea4da70da26631533b27052133f3620cebc5a (patch) | |
| tree | e82e21cf13f804f33216a69e25d42098291e3c94 /src/model/utils.rs | |
| parent | Remove example 01 debugging (diff) | |
| download | serenity-6aeea4da70da26631533b27052133f3620cebc5a.tar.xz serenity-6aeea4da70da26631533b27052133f3620cebc5a.zip | |
Fix deserialization for Ids
Attempt to deserialize from both a str and a u64 instead of the default
derive impl.
Diffstat (limited to 'src/model/utils.rs')
| -rw-r--r-- | src/model/utils.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/model/utils.rs b/src/model/utils.rs index 68a6e1c..309b9de 100644 --- a/src/model/utils.rs +++ b/src/model/utils.rs @@ -115,6 +115,11 @@ pub fn deserialize_users<'de, D: Deserializer<'de>>(deserializer: D) Ok(users) } +pub fn deserialize_u64<'de, D: Deserializer<'de>>(deserializer: D) + -> StdResult<u64, D::Error> { + deserializer.deserialize_u64(U64Visitor) +} + pub fn deserialize_voice_states<'de, D: Deserializer<'de>>(deserializer: D) -> StdResult<HashMap<UserId, VoiceState>, D::Error> { let vec: Vec<VoiceState> = Deserialize::deserialize(deserializer)?; @@ -155,3 +160,37 @@ pub fn user_has_perms(channel_id: ChannelId, mut permissions: Permissions) -> Re Ok(permissions.is_empty()) } + + +pub struct U64Visitor; + +impl<'de> Visitor<'de> for U64Visitor { + type Value = u64; + + fn expecting(&self, formatter: &mut Formatter) -> FmtResult { + formatter.write_str("identifier") + } + + fn visit_str<E: DeError>(self, v: &str) -> StdResult<Self::Value, E> { + match v.parse::<u64>() { + Ok(v) => Ok(v), + Err(_) => { + let mut s = String::new(); + s.push_str("Unknown "); + s.push_str(stringify!($name)); + s.push_str(" value: "); + s.push_str(v); + + Err(DeError::custom(s)) + }, + } + } + + fn visit_i64<E: DeError>(self, v: i64) -> StdResult<Self::Value, E> { + Ok(v as u64) + } + + fn visit_u64<E: DeError>(self, v: u64) -> StdResult<Self::Value, E> { + Ok(v) + } +} |