aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeyla Hellyer <[email protected]>2017-04-25 15:46:18 -0700
committerZeyla Hellyer <[email protected]>2017-04-25 15:46:18 -0700
commit9739d918931978f46cfb16ca1d860936d7a4a6dd (patch)
treef8c6c7e3105747514adbce4a9975553a0cbc6af1
parentFix embed length check (diff)
downloadserenity-9739d918931978f46cfb16ca1d860936d7a4a6dd.tar.xz
serenity-9739d918931978f46cfb16ca1d860936d7a4a6dd.zip
Fix decoding for `CurrentUser.discriminator`
Due to the serde 1.0 upgrade, integers are no longer automatically deserialized from Strings. To resolve this, create a visitor that performs the operation based on the input.
-rw-r--r--src/model/user.rs2
-rw-r--r--src/model/utils.rs37
-rw-r--r--tests/resources/ready_1.json1
-rw-r--r--tests/test_deser.rs5
4 files changed, 45 insertions, 0 deletions
diff --git a/src/model/user.rs b/src/model/user.rs
index 8f7349c..686d394 100644
--- a/src/model/user.rs
+++ b/src/model/user.rs
@@ -1,5 +1,6 @@
use serde_json;
use std::{fmt, mem};
+use super::utils::deserialize_u16;
use super::*;
use time::Timespec;
use ::client::rest::{self, GuildPagination};
@@ -54,6 +55,7 @@ pub struct CurrentUser {
pub avatar: Option<String>,
#[serde(default)]
pub bot: bool,
+ #[serde(deserialize_with="deserialize_u16")]
pub discriminator: u16,
pub email: Option<String>,
pub mfa_enabled: bool,
diff --git a/src/model/utils.rs b/src/model/utils.rs
index 309b9de..a01f134 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_u16<'de, D: Deserializer<'de>>(deserializer: D)
+ -> StdResult<u16, D::Error> {
+ deserializer.deserialize_u16(U16Visitor)
+}
+
pub fn deserialize_u64<'de, D: Deserializer<'de>>(deserializer: D)
-> StdResult<u64, D::Error> {
deserializer.deserialize_u64(U64Visitor)
@@ -161,6 +166,38 @@ pub fn user_has_perms(channel_id: ChannelId, mut permissions: Permissions) -> Re
Ok(permissions.is_empty())
}
+pub struct U16Visitor;
+
+impl<'de> Visitor<'de> for U16Visitor {
+ type Value = u16;
+
+ 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::<u16>() {
+ 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 u16)
+ }
+
+ fn visit_u64<E: DeError>(self, v: u64) -> StdResult<Self::Value, E> {
+ Ok(v as u16)
+ }
+}
pub struct U64Visitor;
diff --git a/tests/resources/ready_1.json b/tests/resources/ready_1.json
new file mode 100644
index 0000000..fa3737a
--- /dev/null
+++ b/tests/resources/ready_1.json
@@ -0,0 +1 @@
+{"v":6,"user_settings":{},"user":{"verified":true,"username":"Ein","mfa_enabled":true,"id":"272502210401665025","email":null,"discriminator":"7305","bot":true,"avatar":"baa93b1247ec074e2aa0cd407ac61794"},"session_id":"f97bdc3210d0da33a3c61d8363e68579","relationships":[],"private_channels":[{"type":1,"recipients":[{"username":"zeyla","id":"114941315417899012","discriminator":"5479","avatar":"a_84b17244128d893e1f09d8d9ac5d8448"}],"last_message_id":"284553955302834176","id":"284553953918582785"}],"presences":[],"guilds":[{"unavailable":true,"id":"244567637332328449"}],"_trace":["discord-gateway-prd-1-19","discord-sessions-prd-1-6"]}
diff --git a/tests/test_deser.rs b/tests/test_deser.rs
index 1b6f8dc..a2d1be7 100644
--- a/tests/test_deser.rs
+++ b/tests/test_deser.rs
@@ -135,6 +135,11 @@ fn message_reaction_remove_all() {
}
#[test]
+fn ready() {
+ p!(ReadyEvent, "ready_1");
+}
+
+#[test]
fn typing_start() {
p!(TypingStartEvent, "typing_start_1");
}