disma 0.16.4

Discord server management has never been easier!
Documentation
use std::sync::Arc;

use crate::{
    permission::PermissionsList,
    role::{AwaitingRole, AwaitingRolesList, ExtraRolesStrategy, KeepExtraRoles, RemoveExtraRoles},
};

use super::{RoleParams, RoleParamsExtraItemsStrategy, RolesParamsList};

impl RolesParamsList {
    pub fn into(self) -> AwaitingRolesList {
        let items = self
            .items
            .into_iter()
            .map(|role| role.into())
            .collect::<Vec<AwaitingRole>>()
            .into();

        AwaitingRolesList {
            items,
            extra_items_strategy: self.extra_items.into(),
        }
    }
}

impl Into<Arc<dyn ExtraRolesStrategy>> for RoleParamsExtraItemsStrategy {
    fn into(self) -> Arc<dyn ExtraRolesStrategy> {
        match self {
            RoleParamsExtraItemsStrategy::Keep => Arc::from(KeepExtraRoles {}),
            RoleParamsExtraItemsStrategy::Remove => Arc::from(RemoveExtraRoles {}),
        }
    }
}

impl Into<AwaitingRole> for RoleParams {
    fn into(self) -> AwaitingRole {
        AwaitingRole {
            name: self.name,
            permissions: PermissionsList::from(self.permissions),
            color: self.color.map(|color| color.to_lowercase()),
            is_mentionable: self.is_mentionable,
            show_in_sidebar: self.show_in_sidebar,
        }
    }
}

#[cfg(test)]
mod tests {
    use std::sync::Arc;

    use crate::{
        api::params::role::{RoleParams, RoleParamsExtraItemsStrategy, RolesParamsList},
        permission::{Permission, PermissionsList},
        role::{AwaitingRole, AwaitingRolesList, KeepExtraRoles, RolesList},
    };

    fn given_matching_params_and_awaiting(name: &str) -> (RoleParams, AwaitingRole) {
        let params = RoleParams {
            name: name.to_string(),
            color: Some("826d5f".to_string()),
            is_mentionable: true,
            show_in_sidebar: false,
            permissions: vec![Permission::ADMINISTRATOR],
        };

        let awaiting = AwaitingRole {
            name: name.to_string(),
            color: Some("826d5f".to_string()),
            is_mentionable: true,
            show_in_sidebar: false,
            permissions: PermissionsList::from(vec![Permission::ADMINISTRATOR]),
        };

        (params, awaiting)
    }

    fn given_matching_params_list_and_awaiting_list(
        name: &str,
    ) -> (RolesParamsList, AwaitingRolesList) {
        let (params, awaiting) = given_matching_params_and_awaiting(name);

        let params_list = RolesParamsList {
            items: vec![params],
            extra_items: RoleParamsExtraItemsStrategy::Keep,
        };

        let awaiting_list = AwaitingRolesList {
            items: RolesList::from(vec![awaiting]),
            extra_items_strategy: Arc::from(KeepExtraRoles {}),
        };

        (params_list, awaiting_list)
    }

    #[test]
    fn can_convert_params_to_awaiting() {
        let name = "Team10";
        let (params, expected_awaiting) = given_matching_params_and_awaiting(name);

        let awaiting: AwaitingRole = params.into();

        assert_eq!(awaiting, expected_awaiting);
    }

    #[test]
    fn can_convert_compressed_params_to_awaiting_entity() {
        let name = "presto";
        let (params_list, expected_awaiting_list) =
            given_matching_params_list_and_awaiting_list(name);

        let awaiting_list: AwaitingRolesList = params_list.into();

        assert_eq!(awaiting_list, expected_awaiting_list);
    }
}