1pub const ROLE_HIERARCHY: &[&str] =
9 &["public", "follower", "supporter", "contributor", "moderator", "leader"];
10
11pub fn expand_roles(highest_roles: &[Box<str>]) -> String {
25 if highest_roles.is_empty() {
26 return String::new();
27 }
28
29 let mut highest_idx: Option<usize> = None;
30 for role in highest_roles {
31 if let Some(idx) = ROLE_HIERARCHY.iter().position(|&r| r == role.as_ref()) {
32 highest_idx = Some(highest_idx.map_or(idx, |h| h.max(idx)));
33 }
34 }
35
36 match highest_idx {
38 Some(idx) => ROLE_HIERARCHY[..=idx].join(","),
39 None => String::new(),
40 }
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46
47 #[test]
48 fn test_expand_roles_empty() {
49 assert_eq!(expand_roles(&[]), "");
50 }
51
52 #[test]
53 fn test_expand_roles_single() {
54 assert_eq!(expand_roles(&["public".into()]), "public");
55 assert_eq!(expand_roles(&["follower".into()]), "public,follower");
56 assert_eq!(
57 expand_roles(&["moderator".into()]),
58 "public,follower,supporter,contributor,moderator"
59 );
60 assert_eq!(
61 expand_roles(&["leader".into()]),
62 "public,follower,supporter,contributor,moderator,leader"
63 );
64 }
65
66 #[test]
67 fn test_expand_roles_multiple() {
68 assert_eq!(
70 expand_roles(&["contributor".into(), "moderator".into()]),
71 "public,follower,supporter,contributor,moderator"
72 );
73 assert_eq!(
74 expand_roles(&["public".into(), "leader".into()]),
75 "public,follower,supporter,contributor,moderator,leader"
76 );
77 }
78
79 #[test]
80 fn test_expand_roles_unknown() {
81 assert_eq!(expand_roles(&["unknown".into()]), "");
83 assert_eq!(
84 expand_roles(&["unknown".into(), "contributor".into()]),
85 "public,follower,supporter,contributor"
86 );
87 }
88}
89
90