twilight_model/gateway/payload/incoming/
guild_create.rs

1use crate::{
2    guild::{Guild, UnavailableGuild},
3    id::{marker::GuildMarker, Id},
4};
5use serde::{Deserialize, Serialize};
6
7// Developer note: Do not change order as we want unavailable to fail
8// first.
9#[allow(clippy::large_enum_variant)]
10#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
11#[serde(untagged)]
12pub enum GuildCreate {
13    Unavailable(UnavailableGuild),
14    Available(Guild),
15}
16
17impl GuildCreate {
18    /// ID of the guild.
19    pub const fn id(&self) -> Id<GuildMarker> {
20        match self {
21            GuildCreate::Available(g) => g.id,
22            GuildCreate::Unavailable(g) => g.id,
23        }
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use serde_test::Token;
30
31    use crate::{guild::UnavailableGuild, id::Id};
32
33    use super::GuildCreate;
34
35    #[test]
36    fn unavailable_guild() {
37        let expected = GuildCreate::Unavailable(UnavailableGuild {
38            id: Id::new(1234),
39            unavailable: true,
40        });
41
42        // Note: serde(untagged) makes the enum transparent which is
43        //       the reason we don't use the variant here.
44        serde_test::assert_tokens(
45            &expected,
46            &[
47                Token::Struct {
48                    name: "UnavailableGuild",
49                    len: 2,
50                },
51                Token::Str("id"),
52                Token::NewtypeStruct { name: "Id" },
53                Token::Str("1234"),
54                Token::Str("unavailable"),
55                Token::Bool(true),
56                Token::StructEnd,
57            ],
58        );
59    }
60}