use std::cmp::Ordering;
use std::fmt::{Display, Formatter, Result as FmtResult};
use ::model::*;
#[cfg(feature="cache")]
use ::CACHE;
#[cfg(all(feature="builder", feature="cache", feature="model"))]
use ::builder::EditRole;
#[cfg(feature="cache")]
use ::internal::prelude::*;
#[cfg(all(feature="cache", feature="model"))]
use ::http;
#[derive(Clone, Debug, Deserialize)]
pub struct Role {
pub id: RoleId,
#[cfg(feature="utils")]
#[serde(rename="color")]
pub colour: Colour,
#[cfg(not(feature="utils"))]
#[serde(rename="color")]
pub colour: u32,
pub hoist: bool,
pub managed: bool,
#[serde(default)]
pub mentionable: bool,
pub name: String,
pub permissions: Permissions,
pub position: i64,
}
#[cfg(feature="model")]
impl Role {
#[cfg(feature="cache")]
#[inline]
pub fn delete(&self) -> Result<()> {
http::delete_role(self.find_guild()?.0, self.id.0)
}
#[cfg(all(feature="builder", feature="cache"))]
pub fn edit<F: FnOnce(EditRole) -> EditRole>(&self, f: F) -> Result<Role> {
match self.find_guild() {
Ok(guild_id) => guild_id.edit_role(self.id, f),
Err(why) => Err(why),
}
}
#[deprecated(since="0.2.1", note="Please use `edit` instead.")]
#[cfg(all(feature="builder", feature="cache"))]
pub fn edit_role<F: FnOnce(EditRole) -> EditRole>(&self, f: F) -> Result<Role> {
self.edit(f)
}
#[cfg(feature="cache")]
pub fn find_guild(&self) -> Result<GuildId> {
for guild in CACHE.read().unwrap().guilds.values() {
let guild = guild.read().unwrap();
if guild.roles.contains_key(&RoleId(self.id.0)) {
return Ok(guild.id);
}
}
Err(Error::Model(ModelError::GuildNotFound))
}
#[inline]
pub fn has_permission(&self, permission: Permissions) -> bool {
self.permissions.contains(permission)
}
pub fn has_permissions(&self, permissions: Permissions, precise: bool)
-> bool {
if precise {
self.permissions == permissions
} else {
self.permissions.contains(permissions)
}
}
}
impl Display for Role {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
Display::fmt(&self.mention(), f)
}
}
impl Eq for Role {}
impl Ord for Role {
fn cmp(&self, other: &Role) -> Ordering {
if self.position == other.position {
self.id.cmp(&other.id)
} else {
self.position.cmp(&other.position)
}
}
}
impl PartialEq for Role {
fn eq(&self, other: &Role) -> bool {
self.id == other.id
}
}
impl PartialOrd for Role {
fn partial_cmp(&self, other: &Role) -> Option<Ordering> {
Some(self.cmp(other))
}
}
#[cfg(feature="model")]
impl RoleId {
#[cfg(feature="cache")]
pub fn find(&self) -> Option<Role> {
let cache = CACHE.read().unwrap();
for guild in cache.guilds.values() {
let guild = guild.read().unwrap();
if !guild.roles.contains_key(self) {
continue;
}
if let Some(role) = guild.roles.get(self) {
return Some(role.clone());
}
}
None
}
}
impl Display for RoleId {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
Display::fmt(&self.0, f)
}
}
impl From<Role> for RoleId {
fn from(role: Role) -> RoleId {
role.id
}
}
impl<'a> From<&'a Role> for RoleId {
fn from(role: &Role) -> RoleId {
role.id
}
}