1use serde::de::{Deserialize, Deserializer};
4use serde::Serialize;
5
6use crate::model::guild::Member;
7use crate::model::id::{ChannelId, GuildId, UserId};
8use crate::model::Timestamp;
9
10#[derive(Clone, Debug, Deserialize, Serialize)]
14#[non_exhaustive]
15pub struct VoiceRegion {
16 pub custom: bool,
18 pub deprecated: bool,
20 pub id: String,
22 pub name: String,
24 pub optimal: bool,
26}
27
28#[cfg_attr(feature = "typesize", derive(typesize::derive::TypeSize))]
32#[derive(Clone, Debug, Deserialize, Serialize)]
33#[serde(remote = "Self")]
34#[non_exhaustive]
35pub struct VoiceState {
36 pub channel_id: Option<ChannelId>,
37 pub deaf: bool,
38 pub guild_id: Option<GuildId>,
39 pub member: Option<Member>,
40 pub mute: bool,
41 pub self_deaf: bool,
42 pub self_mute: bool,
43 pub self_stream: Option<bool>,
44 pub self_video: bool,
45 pub session_id: String,
46 pub suppress: bool,
47 pub user_id: UserId,
48 pub request_to_speak_timestamp: Option<Timestamp>,
52}
53
54impl<'de> Deserialize<'de> for VoiceState {
56 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
57 let mut state = Self::deserialize(deserializer)?;
59 if let (Some(guild_id), Some(member)) = (state.guild_id, state.member.as_mut()) {
60 member.guild_id = guild_id;
61 }
62 Ok(state)
63 }
64}
65
66impl Serialize for VoiceState {
67 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
68 Self::serialize(self, serializer)
70 }
71}