disma 0.16.4

Discord server management has never been easier!
Documentation
use crate::{
    core::{
        diffs::{Diff, Differ},
        ListComparison,
    },
    guild::{AwaitingGuild, ExistingGuild},
    role::{AwaitingRole, ExistingRole},
};

#[derive(PartialEq, Debug)]
pub enum RoleChange {
    Create(AwaitingRole),
    Update(ExistingRole, AwaitingRole, Vec<Diff>),
    Delete(ExistingRole),
}

pub struct RoleChangesService {}

impl RoleChangesService {
    pub fn list_changes(
        &self,
        existing_guild: &ExistingGuild,
        awaiting_guild: &AwaitingGuild,
    ) -> Vec<RoleChange> {
        let ListComparison {
            extra_self: extra_awaiting,
            extra_other: extra_existing,
            same,
        } = awaiting_guild
            .roles
            .items
            .compare_by_name(existing_guild.roles());

        let to_create = extra_awaiting
            .into_iter()
            .map(|awaiting| RoleChange::Create(awaiting.clone()));

        let to_update = same.into_iter().filter_map(|(awaiting, existing)| {
            let diffs = existing.diffs_with(awaiting);
            match diffs.is_empty() {
                true => None,
                false => Some(RoleChange::Update(
                    existing.clone(),
                    awaiting.clone(),
                    diffs,
                )),
            }
        });

        let mut to_delete: Vec<RoleChange> = Vec::new();
        for existing in extra_existing.into_iter() {
            awaiting_guild
                .roles
                .extra_items_strategy
                .handle_extra_role(existing, &mut to_delete)
        }

        to_create.chain(to_update).chain(to_delete).collect()
    }
}