disma 0.16.4

Discord server management has never been easier!
Documentation
use std::collections::HashSet;

use crate::{permission::PermissionsList, role::Role};

#[derive(Debug, Clone)]
pub struct PermissionsOverwrite<T>
where
    T: Role,
{
    pub role: T,
    pub allow: PermissionsList,
    pub deny: PermissionsList,
}

impl<T, U> PartialEq<PermissionsOverwrite<T>> for PermissionsOverwrite<U>
where
    T: Role,
    U: Role,
{
    fn eq(&self, other: &PermissionsOverwrite<T>) -> bool {
        self.role.name() == other.role.name()
            && self.allow == other.allow
            && self.deny == other.deny
    }
}

#[derive(Debug, Clone, PartialEq)]
pub struct PermissionsOverwritesList<R>
where
    R: Role,
{
    items: Vec<PermissionsOverwrite<R>>,
}

impl<R: Role> Default for PermissionsOverwritesList<R> {
    fn default() -> Self {
        Self::new()
    }
}

impl<R: Role> PermissionsOverwritesList<R> {
    pub fn new() -> Self {
        Self { items: vec![] }
    }

    pub fn find_by_role_name(&self, name: &str) -> Option<&PermissionsOverwrite<R>> {
        self.items
            .iter()
            .find(|overwrite| overwrite.role.name() == name)
    }

    pub fn to_list(&self) -> &Vec<PermissionsOverwrite<R>> {
        &self.items
    }
}

impl<R: Role> From<Vec<PermissionsOverwrite<R>>> for PermissionsOverwritesList<R> {
    fn from(overwrites: Vec<PermissionsOverwrite<R>>) -> Self {
        let mut role_names: HashSet<String> = HashSet::new();

        for overwrite in overwrites.iter() {
            if role_names.contains(overwrite.role.name()) {
                panic!("All overwrites must have unique roles.");
            }

            role_names.insert(overwrite.role.name().to_string());
        }

        Self { items: overwrites }
    }
}