aboutsummaryrefslogtreecommitdiff
path: root/src/model/utils.rs
diff options
context:
space:
mode:
authorZeyla Hellyer <[email protected]>2017-06-10 21:55:33 -0700
committerZeyla Hellyer <[email protected]>2017-06-10 21:55:33 -0700
commitd0b64cd64a18a6116267fa09a837d62c19cced42 (patch)
treefc68a0891ea0ddd8187c38f289c8a9ccddc07e8c /src/model/utils.rs
parentFix voice compilation (diff)
downloadserenity-d0b64cd64a18a6116267fa09a837d62c19cced42.tar.xz
serenity-d0b64cd64a18a6116267fa09a837d62c19cced42.zip
Fix negative nonces failing to deserialize
Negative message nonces caused deserialization errors, as serde would not deserialize integers into strings. To fix this, change `Message::nonce` into an `Option<Snowflake>` from an `Option<String>`. This new `Snowflake` is a wrapper around an `i64`. Use a new `I64Visitor` to deserialize i64s, u64s, and strs into the wanted i64.
Diffstat (limited to 'src/model/utils.rs')
-rw-r--r--src/model/utils.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/model/utils.rs b/src/model/utils.rs
index f88ecf5..6363fb6 100644
--- a/src/model/utils.rs
+++ b/src/model/utils.rs
@@ -240,3 +240,34 @@ impl<'de> Visitor<'de> for U64Visitor {
Ok(v)
}
}
+
+pub struct I64Visitor;
+
+impl<'de> Visitor<'de> for I64Visitor {
+ type Value = i64;
+
+ 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::<i64>() {
+ Ok(v) => Ok(v),
+ Err(_) => {
+ let mut s = String::new();
+ s.push_str("Unknown i64 value: ");
+ s.push_str(v);
+
+ Err(DeError::custom(s))
+ },
+ }
+ }
+
+ fn visit_i64<E: DeError>(self, v: i64) -> StdResult<Self::Value, E> {
+ Ok(v)
+ }
+
+ fn visit_u64<E: DeError>(self, v: u64) -> StdResult<Self::Value, E> {
+ Ok(v as i64)
+ }
+}