Skip to main content

ephemeris_forge/access/
name.rs

1crate::non_empty_name! {
2    /// A team name, which is never empty.
3    pub struct TeamName;
4    /// A team name was the empty string.
5    pub error EmptyTeamName("team name cannot be empty");
6}
7
8crate::non_empty_name! {
9    /// A user name, which is never empty and is compared in lowercase.
10    pub struct UserName;
11    /// A user name was the empty string.
12    pub error EmptyUserName("user name cannot be empty");
13    normalize = |value: String| value.to_lowercase();
14}
15
16#[cfg(test)]
17mod tests {
18    use std::collections::BTreeMap;
19
20    use super::{TeamName, UserName};
21
22    #[test]
23    fn user_names_compare_in_lowercase() {
24        let name = UserName::try_from("Octo-Cat".to_owned()).expect("valid");
25        assert_eq!(name.as_str(), "octo-cat");
26        UserName::try_from(String::new()).expect_err("empty");
27    }
28
29    #[test]
30    fn an_empty_name_is_rejected() {
31        TeamName::try_from(String::new()).expect_err("empty");
32    }
33
34    #[test]
35    fn names_decode_as_map_keys_and_empty_keys_fail() {
36        let teams: BTreeMap<TeamName, bool> =
37            facet_json::from_str(r#"{"maintainers":true}"#).expect("decodes");
38        assert_eq!(teams.len(), 1);
39        facet_json::from_str::<BTreeMap<TeamName, bool>>(r#"{"":true}"#).expect_err("empty key");
40    }
41}