aboutsummaryrefslogtreecommitdiff
path: root/src/model/mod.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/mod.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/mod.rs')
-rw-r--r--src/model/mod.rs53
1 files changed, 51 insertions, 2 deletions
diff --git a/src/model/mod.rs b/src/model/mod.rs
index bc414c7..ace5969 100644
--- a/src/model/mod.rs
+++ b/src/model/mod.rs
@@ -53,7 +53,51 @@ use ::utils::Colour;
fn default_true() -> bool { true }
-macro_rules! id {
+macro_rules! id_i64 {
+ ($(#[$attr:meta] $name:ident;)*) => {
+ $(
+ #[$attr]
+ #[derive(Copy, Clone, Debug, Eq, Hash, PartialOrd, Ord, Serialize)]
+ #[allow(derive_hash_xor_eq)]
+ pub struct $name(pub i64);
+
+ impl $name {
+ /// Retrieves the time that the Id was created at.
+ pub fn created_at(&self) -> NaiveDateTime {
+ let offset = (self.0 >> 22) / 1000;
+
+ NaiveDateTime::from_timestamp(1420070400 + offset, 0)
+ }
+ }
+
+ impl From<i64> for $name {
+ fn from(v: i64) -> $name {
+ $name(v)
+ }
+ }
+
+ impl PartialEq for $name {
+ fn eq(&self, other: &Self) -> bool {
+ self.0 == other.0
+ }
+ }
+
+ impl PartialEq<i64> for $name {
+ fn eq(&self, u: &i64) -> bool {
+ self.0 == *u
+ }
+ }
+
+ impl<'de> Deserialize<'de> for $name {
+ fn deserialize<D: Deserializer<'de>>(deserializer: D) -> StdResult<Self, D::Error> {
+ deserializer.deserialize_i64(I64Visitor).map($name)
+ }
+ }
+ )*
+ };
+}
+
+macro_rules! id_u64 {
($(#[$attr:meta] $name:ident;)*) => {
$(
#[$attr]
@@ -97,7 +141,7 @@ macro_rules! id {
}
}
-id! {
+id_u64! {
/// An identifier for a Channel
ChannelId;
/// An identifier for an Emoji
@@ -116,6 +160,11 @@ id! {
WebhookId;
}
+id_i64! {
+ /// An identifier for a general-purpose signed snowflake.
+ Snowflake;
+}
+
/// A container for guilds.
///
/// This is used to differentiate whether a guild itself can be used or whether