twilight_model/guild/invite/
guild.rs

1use super::WelcomeScreen;
2use crate::{
3    guild::{GuildFeature, VerificationLevel},
4    id::{marker::GuildMarker, Id},
5    util::image_hash::ImageHash,
6};
7use serde::{Deserialize, Serialize};
8
9#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
10pub struct InviteGuild {
11    /// Hash of the banner image.
12    pub banner: Option<ImageHash>,
13    /// Description used for guild discovery.
14    pub description: Option<String>,
15    /// List of features that the guild has had enabled.
16    pub features: Vec<GuildFeature>,
17    /// Hash of the icon image.
18    pub icon: Option<ImageHash>,
19    /// ID of the guild.
20    pub id: Id<GuildMarker>,
21    /// Name of the guild.
22    pub name: String,
23    /// Number of boosts the guild has.
24    pub premium_subscription_count: Option<u64>,
25    /// Hash of the splash image.
26    pub splash: Option<ImageHash>,
27    /// Vanity code unique to the guild for invites.
28    pub vanity_url_code: Option<String>,
29    /// Account verification level required to participate.
30    pub verification_level: VerificationLevel,
31    /// Welcome screen for a Community guild.
32    pub welcome_screen: Option<WelcomeScreen>,
33}
34
35#[cfg(test)]
36mod tests {
37    use crate::{
38        guild::{
39            invite::{InviteGuild, WelcomeScreen, WelcomeScreenChannel},
40            GuildFeature, VerificationLevel,
41        },
42        id::Id,
43        test::image_hash,
44    };
45    use serde_test::Token;
46
47    #[test]
48    #[allow(clippy::too_many_lines)]
49    fn test_invite_guild() {
50        let value = InviteGuild {
51            banner: Some(image_hash::BANNER),
52            description: Some("a description".to_owned()),
53            features: Vec::from([GuildFeature::Community]),
54            icon: Some(image_hash::ICON),
55            id: Id::new(1),
56            name: "guild name".to_owned(),
57            premium_subscription_count: Some(14),
58            splash: Some(image_hash::SPLASH),
59            vanity_url_code: Some("twilight".to_owned()),
60            verification_level: VerificationLevel::Medium,
61            welcome_screen: Some(WelcomeScreen {
62                description: Some("welcome description".to_owned()),
63                welcome_channels: vec![
64                    WelcomeScreenChannel {
65                        channel_id: Id::new(123),
66                        description: "channel description".to_owned(),
67                        emoji_id: None,
68                        emoji_name: Some("\u{1f352}".to_owned()),
69                    },
70                    WelcomeScreenChannel {
71                        channel_id: Id::new(456),
72                        description: "custom description".to_owned(),
73                        emoji_id: Some(Id::new(789)),
74                        emoji_name: Some("custom_name".to_owned()),
75                    },
76                ],
77            }),
78        };
79
80        serde_test::assert_tokens(
81            &value,
82            &[
83                Token::Struct {
84                    name: "InviteGuild",
85                    len: 11,
86                },
87                Token::Str("banner"),
88                Token::Some,
89                Token::Str(image_hash::BANNER_INPUT),
90                Token::Str("description"),
91                Token::Some,
92                Token::Str("a description"),
93                Token::Str("features"),
94                Token::Seq { len: Some(1) },
95                Token::Str("COMMUNITY"),
96                Token::SeqEnd,
97                Token::Str("icon"),
98                Token::Some,
99                Token::Str(image_hash::ICON_INPUT),
100                Token::Str("id"),
101                Token::NewtypeStruct { name: "Id" },
102                Token::Str("1"),
103                Token::Str("name"),
104                Token::Str("guild name"),
105                Token::Str("premium_subscription_count"),
106                Token::Some,
107                Token::U64(14),
108                Token::Str("splash"),
109                Token::Some,
110                Token::Str(image_hash::SPLASH_INPUT),
111                Token::Str("vanity_url_code"),
112                Token::Some,
113                Token::Str("twilight"),
114                Token::Str("verification_level"),
115                Token::U8(2),
116                Token::Str("welcome_screen"),
117                Token::Some,
118                Token::Struct {
119                    name: "WelcomeScreen",
120                    len: 2,
121                },
122                Token::Str("description"),
123                Token::Some,
124                Token::Str("welcome description"),
125                Token::Str("welcome_channels"),
126                Token::Seq { len: Some(2) },
127                Token::Struct {
128                    name: "WelcomeScreenChannel",
129                    len: 4,
130                },
131                Token::Str("channel_id"),
132                Token::NewtypeStruct { name: "Id" },
133                Token::Str("123"),
134                Token::Str("description"),
135                Token::Str("channel description"),
136                Token::Str("emoji_id"),
137                Token::None,
138                Token::Str("emoji_name"),
139                Token::Some,
140                Token::Str("\u{1f352}"),
141                Token::StructEnd,
142                Token::Struct {
143                    name: "WelcomeScreenChannel",
144                    len: 4,
145                },
146                Token::Str("channel_id"),
147                Token::NewtypeStruct { name: "Id" },
148                Token::Str("456"),
149                Token::Str("description"),
150                Token::Str("custom description"),
151                Token::Str("emoji_id"),
152                Token::Some,
153                Token::NewtypeStruct { name: "Id" },
154                Token::Str("789"),
155                Token::Str("emoji_name"),
156                Token::Some,
157                Token::Str("custom_name"),
158                Token::StructEnd,
159                Token::SeqEnd,
160                Token::StructEnd,
161                Token::StructEnd,
162            ],
163        )
164    }
165}