1pub use cloudillo_types::utils::parse_roles;
12
13pub use cloudillo_types::roles::{
16 ROLE_HIERARCHY, expand_roles, expand_roles_preserving_extras, role_level,
17};
18
19pub fn highest_role_level(roles: &[Box<str>]) -> usize {
22 roles.iter().filter_map(|r| role_level(r)).max().unwrap_or(0)
23}
24
25pub fn is_leader(roles: &[Box<str>]) -> bool {
29 highest_role_level(roles) >= LEADER_LEVEL
30}
31
32pub const MODERATOR_LEVEL: usize = 4;
34pub const LEADER_LEVEL: usize = 5;
36
37pub fn can_manage_member(actor_level: usize, target_level: usize) -> bool {
41 actor_level >= MODERATOR_LEVEL && (actor_level > target_level || actor_level == LEADER_LEVEL)
42}
43
44pub fn can_manage_member_by_roles(actor_roles: &[Box<str>], target_roles: &[Box<str>]) -> bool {
47 can_manage_member(highest_role_level(actor_roles), highest_role_level(target_roles))
48}
49
50pub fn can_assign_role(role: &str, actor_level: usize) -> bool {
54 match role_level(role) {
55 Some(new_level) => actor_level >= LEADER_LEVEL || new_level < actor_level,
56 None => false,
57 }
58}
59
60#[cfg(test)]
61mod tests {
62 use super::*;
68
69 #[test]
70 fn test_level_consts_match_hierarchy() {
71 assert_eq!(role_level("moderator"), Some(MODERATOR_LEVEL));
72 assert_eq!(role_level("leader"), Some(LEADER_LEVEL));
73 }
74
75 #[test]
76 fn test_can_manage_member() {
77 assert!(can_manage_member(4, 3));
79 assert!(!can_manage_member(4, 4));
81 assert!(can_manage_member(5, 5));
83 assert!(!can_manage_member(3, 0));
85 }
86
87 #[test]
88 fn test_highest_role_level() {
89 assert_eq!(highest_role_level(&[]), 0);
91 assert_eq!(highest_role_level(&["unknown".into()]), 0);
92 assert_eq!(highest_role_level(&["follower".into()]), 1);
94 assert_eq!(highest_role_level(&["moderator".into()]), 4);
95 assert_eq!(highest_role_level(&["leader".into()]), 5);
96 assert_eq!(highest_role_level(&["contributor".into(), "moderator".into()]), 4);
97 assert_eq!(highest_role_level(&["unknown".into(), "leader".into()]), 5);
98 }
99
100 #[test]
101 fn test_is_leader() {
102 assert!(is_leader(&[
104 "public".into(),
105 "follower".into(),
106 "supporter".into(),
107 "contributor".into(),
108 "moderator".into(),
109 "leader".into(),
110 ]));
111 assert!(is_leader(&["leader".into()]));
112 assert!(!is_leader(&[]));
114 assert!(!is_leader(&["contributor".into()]));
115 }
116
117 #[test]
118 fn test_can_manage_member_by_roles() {
119 assert!(can_manage_member_by_roles(&["moderator".into()], &["contributor".into()]));
121 assert!(!can_manage_member_by_roles(&["moderator".into()], &["moderator".into()]));
123 assert!(can_manage_member_by_roles(&["leader".into()], &["leader".into()]));
125 assert!(!can_manage_member_by_roles(&["contributor".into()], &["public".into()]));
127 assert!(!can_manage_member_by_roles(&[], &["public".into()]));
129 assert!(can_manage_member_by_roles(
131 &["unknown".into(), "moderator".into()],
132 &["contributor".into()]
133 ));
134 }
135
136 #[test]
137 fn test_can_assign_role() {
138 assert!(can_assign_role("leader", LEADER_LEVEL));
140 assert!(can_assign_role("moderator", LEADER_LEVEL));
141 assert!(can_assign_role("contributor", LEADER_LEVEL));
142 assert!(can_assign_role("contributor", MODERATOR_LEVEL));
144 assert!(!can_assign_role("moderator", MODERATOR_LEVEL));
145 assert!(!can_assign_role("leader", MODERATOR_LEVEL));
146 assert!(!can_assign_role("unknown", LEADER_LEVEL));
148 }
149}
150
151