     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49

    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 b >= 0x20 && b < 0x7f {
                    write!(f, "{}", b as char)?;
                } else {
                    write!(f, "\\x{:02x}", b)?;
                }
            }
            write!(f, "\"")?;
            Ok(())
        }
    }

    impl Debug for Bytes {
        fn fmt(&self, f: &mut Formatter<'_>) -> Result {
            Debug::fmt(&BytesRef(&self.as_ref()), f)
        }
    }

    impl Debug for BytesMut {
        fn fmt(&self, f: &mut Formatter<'_>) -> Result {
            Debug::fmt(&BytesRef(&self.as_ref()), f)
        }
    }