use std::collections::HashMap;
#[cfg(feature = "model")]
use crate::http::Http;
use crate::internal::prelude::*;
use crate::json::from_number;
#[cfg(feature = "model")]
use crate::model::channel::AttachmentType;
use crate::model::guild::Role;
use crate::model::Permissions;
#[cfg(feature = "model")]
use crate::utils::encode_image;
#[derive(Clone, Debug, Default)]
pub struct EditRole(pub HashMap<&'static str, Value>);
impl EditRole {
#[must_use]
pub fn new(role: &Role) -> Self {
let mut map = HashMap::with_capacity(9);
#[cfg(feature = "utils")]
{
map.insert("color", from_number(role.colour.0));
}
#[cfg(not(feature = "utils"))]
{
map.insert("color", from_number(role.colour));
}
map.insert("hoist", Value::from(role.hoist));
map.insert("managed", Value::from(role.managed));
map.insert("mentionable", Value::from(role.mentionable));
map.insert("name", Value::from(role.name.clone()));
map.insert("permissions", from_number(role.permissions.bits()));
map.insert("position", from_number(role.position));
if let Some(unicode_emoji) = &role.unicode_emoji {
map.insert("unicode_emoji", Value::String(unicode_emoji.clone()));
}
if let Some(icon) = &role.icon {
map.insert("icon", Value::String(icon.clone()));
}
EditRole(map)
}
pub fn colour(&mut self, colour: u64) -> &mut Self {
self.0.insert("color", from_number(colour));
self
}
pub fn hoist(&mut self, hoist: bool) -> &mut Self {
self.0.insert("hoist", Value::from(hoist));
self
}
pub fn mentionable(&mut self, mentionable: bool) -> &mut Self {
self.0.insert("mentionable", Value::from(mentionable));
self
}
pub fn name<S: ToString>(&mut self, name: S) -> &mut Self {
self.0.insert("name", Value::from(name.to_string()));
self
}
pub fn permissions(&mut self, permissions: Permissions) -> &mut Self {
self.0.insert("permissions", from_number(permissions.bits()));
self
}
pub fn position(&mut self, position: u8) -> &mut Self {
self.0.insert("position", from_number(position));
self
}
pub fn unicode_emoji<S: ToString>(&mut self, unicode_emoji: S) -> &mut Self {
self.0.remove("icon");
self.0.insert("unicode_emoji", Value::String(unicode_emoji.to_string()));
self
}
#[cfg(feature = "model")]
pub async fn icon<'a>(
&mut self,
http: impl AsRef<Http>,
icon: impl Into<AttachmentType<'a>>,
) -> Result<&mut Self> {
let icon_data = icon.into().data(&http.as_ref().client).await?;
self.0.remove("unicode_emoji");
self.0.insert("icon", Value::from(encode_image(&icon_data)));
Ok(self)
}
}