twilight_model/guild/
unavailable_guild.rs

1use crate::{
2    id::{marker::GuildMarker, Id},
3    util::mustbe::MustBeBool,
4};
5use serde::{Deserialize, Serialize};
6
7#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize)]
8pub struct UnavailableGuild {
9    pub id: Id<GuildMarker>,
10    pub unavailable: bool,
11}
12
13impl<'de> Deserialize<'de> for UnavailableGuild {
14    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
15    where
16        D: serde::Deserializer<'de>,
17    {
18        #[derive(Deserialize)]
19        #[serde(rename = "UnavailableGuild")] // Tests expect this struct name
20        struct UnavailableGuildIntermediate {
21            id: Id<GuildMarker>,
22            #[allow(unused)] // Only used in the derived impl
23            unavailable: MustBeBool<true>,
24        }
25
26        let intermediate = UnavailableGuildIntermediate::deserialize(deserializer)?;
27
28        Ok(Self {
29            id: intermediate.id,
30            unavailable: true,
31        })
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::UnavailableGuild;
38    use crate::id::Id;
39    use serde_test::Token;
40
41    #[test]
42    fn unavailable_guild() {
43        let value = UnavailableGuild {
44            id: Id::new(1),
45            unavailable: true,
46        };
47
48        serde_test::assert_tokens(
49            &value,
50            &[
51                Token::Struct {
52                    name: "UnavailableGuild",
53                    len: 2,
54                },
55                Token::Str("id"),
56                Token::NewtypeStruct { name: "Id" },
57                Token::Str("1"),
58                Token::Str("unavailable"),
59                Token::Bool(true),
60                Token::StructEnd,
61            ],
62        );
63    }
64}