diff --git a/src/types/entities/user.rs b/src/types/entities/user.rs index 1577479..ddbdc22 100644 --- a/src/types/entities/user.rs +++ b/src/types/entities/user.rs @@ -4,9 +4,11 @@ use crate::types::utils::Snowflake; use chrono::{DateTime, Utc}; -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde_aux::prelude::deserialize_option_number_from_string; use std::fmt::Debug; +use std::num::ParseIntError; +use std::str::FromStr; #[cfg(feature = "client")] use crate::gateway::Updateable; @@ -111,7 +113,7 @@ impl From for PublicUser { const CUSTOM_USER_FLAG_OFFSET: u64 = 1 << 32; bitflags::bitflags! { - #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)] + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[cfg_attr(feature = "sqlx", derive(chorus_macros::SqlxBitFlags))] pub struct UserFlags: u64 { const DISCORD_EMPLOYEE = 1 << 0; @@ -137,6 +139,28 @@ bitflags::bitflags! { } } +impl FromStr for UserFlags { + type Err = ParseIntError; + + fn from_str(s: &str) -> Result { + s.parse::().map(UserFlags::from_bits).map(|f| f.unwrap_or(UserFlags::empty())) + } +} + +impl Serialize for UserFlags { + fn serialize(&self, serializer: S) -> Result { + serializer.serialize_str(&self.bits().to_string()) + } +} + +impl<'de> Deserialize<'de> for UserFlags { + fn deserialize(deserializer: D) -> Result where D: Deserializer<'de> { + let s = String::deserialize(deserializer)?.parse::().map_err(serde::de::Error::custom)?; + + Ok(UserFlags::from_bits(s).unwrap()) + } +} + #[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] pub struct UserProfileMetadata { pub guild_id: Option,