twilight_model/guild/
partial_guild.rs

1use super::{
2    AfkTimeout, DefaultMessageNotificationLevel, Emoji, ExplicitContentFilter, GuildFeature,
3    MfaLevel, NSFWLevel, Permissions, PremiumTier, Role, SystemChannelFlags, VerificationLevel,
4};
5use crate::{
6    id::{
7        marker::{ApplicationMarker, ChannelMarker, GuildMarker, UserMarker},
8        Id,
9    },
10    util::image_hash::ImageHash,
11};
12use serde::{Deserialize, Serialize};
13
14#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
15pub struct PartialGuild {
16    pub afk_channel_id: Option<Id<ChannelMarker>>,
17    pub afk_timeout: AfkTimeout,
18    pub application_id: Option<Id<ApplicationMarker>>,
19    pub banner: Option<ImageHash>,
20    pub default_message_notifications: DefaultMessageNotificationLevel,
21    pub description: Option<String>,
22    pub discovery_splash: Option<ImageHash>,
23    pub emojis: Vec<Emoji>,
24    pub explicit_content_filter: ExplicitContentFilter,
25    pub features: Vec<GuildFeature>,
26    pub icon: Option<ImageHash>,
27    pub id: Id<GuildMarker>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub max_members: Option<u64>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub max_presences: Option<u64>,
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub member_count: Option<u64>,
34    pub mfa_level: MfaLevel,
35    pub name: String,
36    pub nsfw_level: NSFWLevel,
37    pub owner_id: Id<UserMarker>,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub owner: Option<bool>,
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub permissions: Option<Permissions>,
42    pub preferred_locale: String,
43    /// Whether the premium progress bar is enabled in the guild.
44    pub premium_progress_bar_enabled: bool,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub premium_subscription_count: Option<u64>,
47    pub premium_tier: PremiumTier,
48    /// ID of the where moderators of Community guilds receive notices from
49    /// Discord.
50    pub public_updates_channel_id: Option<Id<ChannelMarker>>,
51    pub roles: Vec<Role>,
52    pub rules_channel_id: Option<Id<ChannelMarker>>,
53    pub splash: Option<ImageHash>,
54    pub system_channel_flags: SystemChannelFlags,
55    pub system_channel_id: Option<Id<ChannelMarker>>,
56    pub verification_level: VerificationLevel,
57    pub vanity_url_code: Option<String>,
58    #[serde(skip_serializing_if = "Option::is_none")]
59    pub widget_channel_id: Option<Id<ChannelMarker>>,
60    #[serde(skip_serializing_if = "Option::is_none")]
61    pub widget_enabled: Option<bool>,
62}
63
64#[cfg(test)]
65mod tests {
66    use crate::{
67        guild::{AfkTimeout, GuildFeature},
68        test::image_hash,
69    };
70
71    use super::{
72        DefaultMessageNotificationLevel, ExplicitContentFilter, MfaLevel, NSFWLevel, PartialGuild,
73        Permissions, PremiumTier, SystemChannelFlags, VerificationLevel,
74    };
75    use crate::id::Id;
76    use serde_test::Token;
77
78    #[allow(clippy::too_many_lines)]
79    #[test]
80    fn partial_guild() {
81        let value = PartialGuild {
82            afk_channel_id: Some(Id::new(2)),
83            afk_timeout: AfkTimeout::FIFTEEN_MINUTES,
84            application_id: Some(Id::new(3)),
85            banner: Some(image_hash::BANNER),
86            default_message_notifications: DefaultMessageNotificationLevel::Mentions,
87            description: Some("a description".to_owned()),
88            discovery_splash: Some(image_hash::SPLASH),
89            emojis: Vec::new(),
90            explicit_content_filter: ExplicitContentFilter::MembersWithoutRole,
91            features: Vec::from([GuildFeature::AnimatedBanner]),
92            icon: Some(image_hash::ICON),
93            id: Id::new(1),
94            max_members: Some(25_000),
95            max_presences: Some(10_000),
96            member_count: Some(12_000),
97            mfa_level: MfaLevel::Elevated,
98            name: "the name".to_owned(),
99            nsfw_level: NSFWLevel::Default,
100            owner_id: Id::new(5),
101            owner: Some(false),
102            permissions: Some(Permissions::SEND_MESSAGES),
103            preferred_locale: "en-us".to_owned(),
104            premium_progress_bar_enabled: true,
105            premium_subscription_count: Some(3),
106            premium_tier: PremiumTier::Tier1,
107            public_updates_channel_id: None,
108            roles: Vec::new(),
109            rules_channel_id: Some(Id::new(6)),
110            splash: Some(image_hash::SPLASH),
111            system_channel_flags: SystemChannelFlags::SUPPRESS_PREMIUM_SUBSCRIPTIONS,
112            system_channel_id: Some(Id::new(7)),
113            verification_level: VerificationLevel::Medium,
114            vanity_url_code: Some("twilight".to_owned()),
115            widget_channel_id: Some(Id::new(8)),
116            widget_enabled: Some(true),
117        };
118
119        serde_test::assert_tokens(
120            &value,
121            &[
122                Token::Struct {
123                    name: "PartialGuild",
124                    len: 35,
125                },
126                Token::Str("afk_channel_id"),
127                Token::Some,
128                Token::NewtypeStruct { name: "Id" },
129                Token::Str("2"),
130                Token::Str("afk_timeout"),
131                Token::NewtypeStruct { name: "AfkTimeout" },
132                Token::U16(900),
133                Token::Str("application_id"),
134                Token::Some,
135                Token::NewtypeStruct { name: "Id" },
136                Token::Str("3"),
137                Token::Str("banner"),
138                Token::Some,
139                Token::Str(image_hash::BANNER_INPUT),
140                Token::Str("default_message_notifications"),
141                Token::U8(1),
142                Token::Str("description"),
143                Token::Some,
144                Token::Str("a description"),
145                Token::Str("discovery_splash"),
146                Token::Some,
147                Token::Str(image_hash::SPLASH_INPUT),
148                Token::Str("emojis"),
149                Token::Seq { len: Some(0) },
150                Token::SeqEnd,
151                Token::Str("explicit_content_filter"),
152                Token::U8(1),
153                Token::Str("features"),
154                Token::Seq { len: Some(1) },
155                Token::Str("ANIMATED_BANNER"),
156                Token::SeqEnd,
157                Token::Str("icon"),
158                Token::Some,
159                Token::Str(image_hash::ICON_INPUT),
160                Token::Str("id"),
161                Token::NewtypeStruct { name: "Id" },
162                Token::Str("1"),
163                Token::Str("max_members"),
164                Token::Some,
165                Token::U64(25_000),
166                Token::Str("max_presences"),
167                Token::Some,
168                Token::U64(10_000),
169                Token::Str("member_count"),
170                Token::Some,
171                Token::U64(12_000),
172                Token::Str("mfa_level"),
173                Token::U8(1),
174                Token::Str("name"),
175                Token::Str("the name"),
176                Token::Str("nsfw_level"),
177                Token::U8(0),
178                Token::Str("owner_id"),
179                Token::NewtypeStruct { name: "Id" },
180                Token::Str("5"),
181                Token::Str("owner"),
182                Token::Some,
183                Token::Bool(false),
184                Token::Str("permissions"),
185                Token::Some,
186                Token::Str("2048"),
187                Token::Str("preferred_locale"),
188                Token::Str("en-us"),
189                Token::Str("premium_progress_bar_enabled"),
190                Token::Bool(true),
191                Token::Str("premium_subscription_count"),
192                Token::Some,
193                Token::U64(3),
194                Token::Str("premium_tier"),
195                Token::U8(1),
196                Token::Str("public_updates_channel_id"),
197                Token::None,
198                Token::Str("roles"),
199                Token::Seq { len: Some(0) },
200                Token::SeqEnd,
201                Token::Str("rules_channel_id"),
202                Token::Some,
203                Token::NewtypeStruct { name: "Id" },
204                Token::Str("6"),
205                Token::Str("splash"),
206                Token::Some,
207                Token::Str(image_hash::SPLASH_INPUT),
208                Token::Str("system_channel_flags"),
209                Token::U64(2),
210                Token::Str("system_channel_id"),
211                Token::Some,
212                Token::NewtypeStruct { name: "Id" },
213                Token::Str("7"),
214                Token::Str("verification_level"),
215                Token::U8(2),
216                Token::Str("vanity_url_code"),
217                Token::Some,
218                Token::Str("twilight"),
219                Token::Str("widget_channel_id"),
220                Token::Some,
221                Token::NewtypeStruct { name: "Id" },
222                Token::Str("8"),
223                Token::Str("widget_enabled"),
224                Token::Some,
225                Token::Bool(true),
226                Token::StructEnd,
227            ],
228        );
229    }
230}