| use core::fmt::{Debug, Formatter, Result}; |
| |
| use super::BytesRef; |
| use crate::{Bytes, BytesMut}; |
| |
| /// Alternative implementation of `std::fmt::Debug` for byte slice. |
| /// |
| /// Standard `Debug` implementation for `[u8]` is comma separated |
| /// list of numbers. Since large amount of byte strings are in fact |
| /// ASCII strings or contain a lot of ASCII strings (e. g. HTTP), |
| /// it is convenient to print strings as ASCII when possible. |
| impl Debug for BytesRef<'_> { |
| fn fmt(&self, f: &mut Formatter<'_>) -> Result { |
| write!(f, "b\"")?; |
| for &b in self.0 { |
| // https://doc.rust-lang.org/reference/tokens.html#byte-escapes |
| if b == b'\n' { |
| write!(f, "\\n")?; |
| } else if b == b'\r' { |
| write!(f, "\\r")?; |
| } else if b == b'\t' { |
| write!(f, "\\t")?; |
| } else if b == b'\\' || b == b'"' { |
| write!(f, "\\{}", b as char)?; |
| } else if b == b'\0' { |
| write!(f, "\\0")?; |
| // ASCII printable |
| } else if (0x20..0x7f).contains(&b) { |
| write!(f, "{}", b as char)?; |
| } else { |
| write!(f, "\\x{:02x}", b)?; |
| } |
| } |
| write!(f, "\"")?; |
| Ok(()) |
| } |
| } |
| |
| fmt_impl!(Debug, Bytes); |
| fmt_impl!(Debug, BytesMut); |