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