1use core::fmt::*;
2
3mod tests;
4
5pub(crate) mod types {
6 #[allow(unused)]
7 use super::*;
8
9 #[derive(Clone, Copy)]
11 pub struct ToAsciiUppercase<T> {
12 pub(super) value: T,
13 }
14
15 #[derive(Clone, Copy)]
17 pub struct ToAsciiLowercase<T> {
18 pub(super) value: T,
19 }
20}
21
22use types::*;
23
24pub fn to_ascii_uppercase<T>(value: T) -> ToAsciiUppercase<T> {
36 ToAsciiUppercase { value }
37}
38
39pub fn to_ascii_lowercase<T>(value: T) -> ToAsciiLowercase<T> {
51 ToAsciiLowercase { value }
52}
53
54struct AsciiWriter<'a, 'b> {
56 f: &'b mut Formatter<'a>,
57 uppercase: bool,
58}
59
60impl Write for AsciiWriter<'_, '_> {
61 fn write_str(&mut self, s: &str) -> Result {
62 for c in s.chars() {
63 self.write_char(c)?;
64 }
65 Ok(())
66 }
67
68 fn write_char(&mut self, c: char) -> Result {
69 self.f.write_char(if self.uppercase {
70 c.to_ascii_uppercase()
71 } else {
72 c.to_ascii_lowercase()
73 })
74 }
75}
76
77impl<T: Debug> Debug for ToAsciiLowercase<T> {
78 fn fmt(&self, f: &mut Formatter) -> Result {
79 write!(AsciiWriter { f, uppercase: false }, "{:?}", self.value)
80 }
81}
82
83impl<T: Display> Display for ToAsciiLowercase<T> {
84 fn fmt(&self, f: &mut Formatter) -> Result {
85 write!(AsciiWriter { f, uppercase: false }, "{}", self.value)
86 }
87}
88
89impl<T: Debug> Debug for ToAsciiUppercase<T> {
90 fn fmt(&self, f: &mut Formatter) -> Result {
91 write!(AsciiWriter { f, uppercase: true }, "{:?}", self.value)
92 }
93}
94
95impl<T: Display> Display for ToAsciiUppercase<T> {
96 fn fmt(&self, f: &mut Formatter) -> Result {
97 write!(AsciiWriter { f, uppercase: true }, "{}", self.value)
98 }
99}