Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion twilight-cache-inmemory/src/event/interaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ mod tests {
Channel, ChannelType, Message,
},
gateway::payload::incoming::InteractionCreate,
guild::{MemberFlags, PartialMember, Permissions, Role},
guild::{MemberFlags, PartialMember, Permissions, Role, RoleFlags},
id::Id,
user::User,
util::{image_hash::ImageHashParseError, ImageHash, Timestamp},
Expand Down Expand Up @@ -239,6 +239,7 @@ mod tests {
name: "role name".into(),
permissions: Permissions::empty(),
position: 2i64,
flags: RoleFlags::empty(),
tags: None,
unicode_emoji: None,
},
Expand Down
4 changes: 3 additions & 1 deletion twilight-cache-inmemory/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -929,7 +929,7 @@ mod tests {
use crate::{test, InMemoryCache};
use twilight_model::{
gateway::payload::incoming::RoleDelete,
guild::{Member, MemberFlags, Permissions, Role},
guild::{Member, MemberFlags, Permissions, Role, RoleFlags},
id::Id,
util::Timestamp,
};
Expand Down Expand Up @@ -990,6 +990,7 @@ mod tests {
name: "test".to_owned(),
permissions: Permissions::empty(),
position: 0,
flags: RoleFlags::empty(),
tags: None,
unicode_emoji: None,
},
Expand All @@ -1003,6 +1004,7 @@ mod tests {
name: "test".to_owned(),
permissions: Permissions::empty(),
position: 1,
flags: RoleFlags::empty(),
tags: None,
unicode_emoji: None,
},
Expand Down
3 changes: 2 additions & 1 deletion twilight-cache-inmemory/src/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use twilight_model::{
},
guild::{
AfkTimeout, DefaultMessageNotificationLevel, Emoji, ExplicitContentFilter, Guild, Member,
MemberFlags, MfaLevel, NSFWLevel, PartialMember, Permissions, PremiumTier, Role,
MemberFlags, MfaLevel, NSFWLevel, PartialMember, Permissions, PremiumTier, Role, RoleFlags,
SystemChannelFlags, VerificationLevel,
},
id::{
Expand Down Expand Up @@ -299,6 +299,7 @@ pub fn role(id: Id<RoleMarker>) -> Role {
name: "test".to_owned(),
permissions: Permissions::empty(),
position: 0,
flags: RoleFlags::empty(),
tags: None,
unicode_emoji: None,
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ mod tests {
},
Attachment, ChannelType, Message,
},
guild::{MemberFlags, PartialMember, Permissions, Role},
guild::{MemberFlags, PartialMember, Permissions, Role, RoleFlags},
id::Id,
test::image_hash,
user::{PremiumType, User, UserFlags},
Expand Down Expand Up @@ -248,6 +248,7 @@ mod tests {
name: "test".to_owned(),
permissions: Permissions::ADMINISTRATOR,
position: 12,
flags: RoleFlags::empty(),
tags: None,
unicode_emoji: None,
},
Expand Down Expand Up @@ -478,7 +479,7 @@ mod tests {
Token::Str("400"),
Token::Struct {
name: "Role",
len: 8,
len: 9,
},
Token::Str("color"),
Token::U32(0),
Expand All @@ -497,6 +498,8 @@ mod tests {
Token::Str("8"),
Token::Str("position"),
Token::I64(12),
Token::Str("flags"),
Token::U64(0),
Token::StructEnd,
Token::MapEnd,
Token::Str("users"),
Expand Down
6 changes: 4 additions & 2 deletions twilight-model/src/gateway/event/gateway.rs
Original file line number Diff line number Diff line change
Expand Up @@ -520,7 +520,8 @@ mod tests {
"mentionable": false,
"name": "@everyone",
"permissions": "104193601",
"position": 0
"position": 0,
"flags": 0
}}
],
"rules_channel_id": null,
Expand Down Expand Up @@ -595,7 +596,8 @@ mod tests {
"mentionable": false,
"name": "@everyone",
"permissions": "104324673",
"position": 0
"position": 0,
"flags": 0
}}
],
"rules_channel_id": null,
Expand Down
10 changes: 8 additions & 2 deletions twilight-model/src/gateway/payload/incoming/role_update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,10 @@ pub struct RoleUpdate {
#[cfg(test)]
mod tests {
use super::{Role, RoleUpdate};
use crate::{guild::Permissions, id::Id};
use crate::{
guild::{Permissions, RoleFlags},
id::Id,
};
use serde_test::Token;

#[test]
Expand All @@ -30,6 +33,7 @@ mod tests {
name: "a role".to_owned(),
permissions: Permissions::SEND_MESSAGES,
position: 12,
flags: RoleFlags::empty(),
tags: None,
unicode_emoji: None,
},
Expand All @@ -48,7 +52,7 @@ mod tests {
Token::Str("role"),
Token::Struct {
name: "Role",
len: 8,
len: 9,
},
Token::Str("color"),
Token::U32(0),
Expand All @@ -67,6 +71,8 @@ mod tests {
Token::Str("2048"),
Token::Str("position"),
Token::I64(12),
Token::Str("flags"),
Token::U64(0),
Token::StructEnd,
Token::StructEnd,
],
Expand Down
7 changes: 4 additions & 3 deletions twilight-model/src/guild/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ mod premium_tier;
mod preview;
mod prune;
mod role;
mod role_flags;
mod role_tags;
mod system_channel_flags;
mod unavailable_guild;
Expand All @@ -52,9 +53,9 @@ pub use self::{
integration_expire_behavior::IntegrationExpireBehavior, integration_type::GuildIntegrationType,
member::Member, member_flags::MemberFlags, mfa_level::MfaLevel, partial_guild::PartialGuild,
partial_member::PartialMember, premium_tier::PremiumTier, preview::GuildPreview,
prune::GuildPrune, role::Role, role_tags::RoleTags, system_channel_flags::SystemChannelFlags,
unavailable_guild::UnavailableGuild, vanity_url::VanityUrl,
verification_level::VerificationLevel, widget::GuildWidget,
prune::GuildPrune, role::Role, role_flags::RoleFlags, role_tags::RoleTags,
system_channel_flags::SystemChannelFlags, unavailable_guild::UnavailableGuild,
vanity_url::VanityUrl, verification_level::VerificationLevel, widget::GuildWidget,
};

use super::gateway::presence::PresenceListDeserializer;
Expand Down
19 changes: 14 additions & 5 deletions twilight-model/src/guild/role.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use super::RoleTags;
use super::{RoleFlags, RoleTags};
use crate::{
guild::Permissions,
id::{marker::RoleMarker, Id},
Expand Down Expand Up @@ -27,6 +27,8 @@ pub struct Role {
pub name: String,
pub permissions: Permissions,
pub position: i64,
/// Flags for this role.
pub flags: RoleFlags,
/// Tags about the role.
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<RoleTags>,
Expand Down Expand Up @@ -55,7 +57,7 @@ impl Ord for Role {
/// Compare the position of two roles:
///
/// ```
/// # use twilight_model::{guild::{Permissions, Role}, id::Id};
/// # use twilight_model::{guild::{Permissions, Role, RoleFlags}, id::Id};
/// # use std::cmp::Ordering;
/// let role_a = Role {
/// id: Id::new(123),
Expand All @@ -67,6 +69,7 @@ impl Ord for Role {
/// # mentionable: true,
/// # name: "test".to_owned(),
/// # permissions: Permissions::ADMINISTRATOR,
/// # flags: RoleFlags::empty(),
/// # tags: None,
/// # unicode_emoji: None,
/// // ...
Expand All @@ -81,6 +84,7 @@ impl Ord for Role {
/// # mentionable: true,
/// # name: "test".to_owned(),
/// # permissions: Permissions::ADMINISTRATOR,
/// # flags: RoleFlags::empty(),
/// # tags: None,
/// # unicode_emoji: None,
/// // ...
Expand All @@ -94,7 +98,7 @@ impl Ord for Role {
/// Compare the position of two roles with the same position:
///
/// ```
/// # use twilight_model::{guild::{Permissions, Role}, id::Id};
/// # use twilight_model::{guild::{Permissions, Role, RoleFlags}, id::Id};
/// # use std::cmp::Ordering;
/// let role_a = Role {
/// id: Id::new(123),
Expand All @@ -106,6 +110,7 @@ impl Ord for Role {
/// # mentionable: true,
/// # name: "test".to_owned(),
/// # permissions: Permissions::ADMINISTRATOR,
/// # flags: RoleFlags::empty(),
/// # tags: None,
/// # unicode_emoji: None,
/// };
Expand All @@ -119,6 +124,7 @@ impl Ord for Role {
/// # mentionable: true,
/// # name: "test".to_owned(),
/// # permissions: Permissions::ADMINISTRATOR,
/// # flags: RoleFlags::empty(),
/// # tags: None,
/// # unicode_emoji: None,
/// };
Expand All @@ -143,7 +149,7 @@ impl PartialOrd for Role {
#[cfg(test)]
mod tests {
use super::{Permissions, Role};
use crate::id::Id;
use crate::{guild::RoleFlags, id::Id};
use serde::{Deserialize, Serialize};
use serde_test::Token;
use static_assertions::{assert_fields, assert_impl_all};
Expand Down Expand Up @@ -185,6 +191,7 @@ mod tests {
name: "test".to_owned(),
permissions: Permissions::ADMINISTRATOR,
position: 12,
flags: RoleFlags::IN_PROMPT,
tags: None,
unicode_emoji: None,
};
Expand All @@ -194,7 +201,7 @@ mod tests {
&[
Token::Struct {
name: "Role",
len: 8,
len: 9,
},
Token::Str("color"),
Token::U32(0),
Expand All @@ -213,6 +220,8 @@ mod tests {
Token::Str("8"),
Token::Str("position"),
Token::I64(12),
Token::Str("flags"),
Token::U64(1),
Token::StructEnd,
],
);
Expand Down
90 changes: 90 additions & 0 deletions twilight-model/src/guild/role_flags.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
use bitflags::bitflags;
use serde::{
de::{Deserialize, Deserializer},
ser::{Serialize, Serializer},
};

bitflags! {
// The flags for a role represented as a bitfield.
pub struct RoleFlags: u64 {
// A role that is available to select within guild onboarding.
const IN_PROMPT = 1 << 0;
}
}

impl<'de> Deserialize<'de> for RoleFlags {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
Ok(Self::from_bits_truncate(u64::deserialize(deserializer)?))
}
}

impl Serialize for RoleFlags {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_u64(self.bits())
}
}

#[cfg(test)]
mod tests {
use super::RoleFlags;
use serde::{Deserialize, Serialize};
use serde_test::Token;
use static_assertions::{assert_impl_all, const_assert_eq};
use std::{
fmt::{Binary, Debug, LowerHex, Octal, UpperHex},
hash::Hash,
ops::{
BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not, Sub, SubAssign,
},
};

assert_impl_all!(
RoleFlags: Binary,
BitAnd,
BitAndAssign,
BitOr,
BitOrAssign,
BitXor,
BitXorAssign,
Clone,
Copy,
Debug,
Deserialize<'static>,
Eq,
Extend<RoleFlags>,
FromIterator<RoleFlags>,
Hash,
LowerHex,
Not,
Octal,
Ord,
PartialEq,
PartialOrd,
Send,
Serialize,
Sub,
SubAssign,
UpperHex,
);

const_assert_eq!(1 << 0, RoleFlags::IN_PROMPT.bits());

#[test]
fn deserialize() {
serde_test::assert_tokens(
&RoleFlags::IN_PROMPT,
&[Token::U64(RoleFlags::IN_PROMPT.bits())],
);
}

#[test]
fn serialize() {
serde_test::assert_tokens(
&RoleFlags::IN_PROMPT,
&[Token::U64(RoleFlags::IN_PROMPT.bits())],
);
}
}