Skip to main content

smart_format/case/
lowercase.rs

1use crate::prelude::*;
2
3pub struct Lowercase<T: fmt::Display>(pub T);
4
5impl<T: fmt::Display> fmt::Display for Lowercase<T> {
6    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
7        use fmt::Write;
8
9        self.0.format_with(|s: Option<&str>| {
10            let Some(s) = s else { return Ok(()) };
11
12            for c in s.chars().flat_map(char::to_lowercase) {
13                f.write_char(c)?;
14            }
15
16            Ok(())
17        })
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use super::super::tests::WORD_CASES;
24    use super::*;
25
26    #[test]
27    fn it_works() {
28        fn test_case(expected: &str, sample: &str) {
29            assert_eq!(expected, Lowercase(sample).to_string());
30        }
31
32        for &word in WORD_CASES {
33            test_case("word", word);
34        }
35    }
36
37    #[test]
38    fn empty() {
39        assert_eq!("", Lowercase("").to_string());
40    }
41
42    #[test]
43    fn single_char() {
44        assert_eq!("a", Lowercase("A").to_string());
45    }
46
47    #[test]
48    fn german_eszett() {
49        // ß is already lowercase; lowercasing is a no-op
50        assert_eq!("ß", Lowercase("ß").to_string());
51    }
52
53    #[test]
54    fn cyrillic() {
55        assert_eq!("привіт", Lowercase("ПРИВІТ").to_string());
56    }
57}