smart_format/case/
lowercase.rs1use 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 assert_eq!("ß", Lowercase("ß").to_string());
51 }
52
53 #[test]
54 fn cyrillic() {
55 assert_eq!("привіт", Lowercase("ПРИВІТ").to_string());
56 }
57}