1/// A type that wraps a single byte with a convenient fmt::Debug impl that
2/// escapes the byte.
3pub(crate) struct DebugByte(pub(crate) u8);
4
5impl core::fmt::Debug for DebugByte {
6 fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
7 // Special case ASCII space. It's too hard to read otherwise, so
8 // put quotes around it. I sometimes wonder whether just '\x20' would
9 // be better...
10 if self.0 == b' ' {
11 return write!(f, "' '");
12 }
13 // 10 bytes is enough to cover any output from ascii::escape_default.
14 let mut bytes = [0u8; 10];
15 let mut len = 0;
16 for (i, mut b) in core::ascii::escape_default(self.0).enumerate() {
17 // capitalize \xab to \xAB
18 if i >= 2 && b'a' <= b && b <= b'f' {
19 b -= 32;
20 }
21 bytes[len] = b;
22 len += 1;
23 }
24 write!(f, "{}", core::str::from_utf8(&bytes[..len]).unwrap())
25 }
26}
27