diff --git a/src/model/gateway.rs b/src/model/gateway.rs index a2abfff084b..39cb1d26747 100644 --- a/src/model/gateway.rs +++ b/src/model/gateway.rs @@ -36,6 +36,7 @@ pub struct BotGateway { #[non_exhaustive] pub struct Activity { /// The ID of the application for the activity. + #[serde(deserialize_with = "deserialize_buggy_id")] pub application_id: Option, /// Images for the presence and their texts. pub assets: Option, diff --git a/src/model/utils.rs b/src/model/utils.rs index 98572deaaa2..aa8dfe3570f 100644 --- a/src/model/utils.rs +++ b/src/model/utils.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; use std::fmt; use std::hash::Hash; use std::marker::PhantomData; +use std::num::NonZeroU64; use serde::ser::{Serialize, SerializeSeq, Serializer}; @@ -67,6 +68,17 @@ where remove_from_map_opt(map, key)?.ok_or_else(|| serde::de::Error::missing_field(key)) } +/// Workaround for Discord sending 0 value Ids as default values. +/// This has been fixed properly on next by swapping to a NonMax based impl. +pub fn deserialize_buggy_id<'de, D, Id>(deserializer: D) -> StdResult, D::Error> +where + D: Deserializer<'de>, + Id: From, +{ + let raw = Option::::deserialize(deserializer)?; + Ok(raw.and_then(NonZeroU64::new).map(Into::into)) +} + /// Used with `#[serde(with = "emojis")]` pub mod emojis { use std::collections::HashMap;