twilight_model/user/current_user_guild.rs
1use crate::{
2 guild::Permissions,
3 id::{marker::GuildMarker, Id},
4 util::image_hash::ImageHash,
5};
6use serde::{Deserialize, Serialize};
7
8/// Information about a guild the current user is in.
9///
10/// This is a partial guild used for the `Get Current User Guilds` endpoint.
11/// See [Discord Docs/Get Current User Guilds].
12///
13/// [Discord Docs/Get Current User Guilds]: https://discord.com/developers/docs/resources/user#get-current-user-guilds-example-partial-guild
14#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
15pub struct CurrentUserGuild {
16 /// Unique ID.
17 pub id: Id<GuildMarker>,
18 /// Name of the guild.
19 ///
20 /// The name must be at least 2 characters long and at most 100 characters
21 /// long.
22 pub name: String,
23 /// Hash of the icon.
24 ///
25 /// See [Discord Docs/Image Formatting].
26 ///
27 /// [Discord Docs/Image Formatting]: https://discord.com/developers/docs/reference#image-formatting
28 pub icon: Option<ImageHash>,
29 /// Whether the current user is the owner.
30 pub owner: bool,
31 /// Permissions of the current user in the guild. This excludes channels'
32 /// permission overwrites.
33 pub permissions: Permissions,
34 /// List of enabled guild features.
35 pub features: Vec<String>,
36}
37
38#[cfg(test)]
39mod tests {
40 use super::{CurrentUserGuild, Permissions};
41 use crate::{id::Id, test::image_hash};
42 use serde_test::Token;
43
44 #[test]
45 fn current_user_guild() {
46 // The example partial guild from the Discord Docs
47 let value = CurrentUserGuild {
48 id: Id::new(80_351_110_224_678_912),
49 name: "abcd".to_owned(),
50 icon: Some(image_hash::ICON),
51 owner: true,
52 permissions: Permissions::from_bits_truncate(36_953_089),
53 features: vec!["a feature".to_owned()],
54 };
55
56 serde_test::assert_tokens(
57 &value,
58 &[
59 Token::Struct {
60 name: "CurrentUserGuild",
61 len: 6,
62 },
63 Token::Str("id"),
64 Token::NewtypeStruct { name: "Id" },
65 Token::Str("80351110224678912"),
66 Token::Str("name"),
67 Token::Str("abcd"),
68 Token::Str("icon"),
69 Token::Some,
70 Token::Str(image_hash::ICON_INPUT),
71 Token::Str("owner"),
72 Token::Bool(true),
73 Token::Str("permissions"),
74 Token::Str("36953089"),
75 Token::Str("features"),
76 Token::Seq { len: Some(1) },
77 Token::Str("a feature"),
78 Token::SeqEnd,
79 Token::StructEnd,
80 ],
81 );
82 }
83}