diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bytes.rs | 5 | ||||
-rw-r--r-- | src/debug.rs | 40 | ||||
-rw-r--r-- | src/lib.rs | 1 |
3 files changed, 44 insertions, 2 deletions
diff --git a/src/bytes.rs b/src/bytes.rs index 954c310..fcec6cc 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -1,5 +1,6 @@ use {IntoBuf, Buf, BufMut}; use buf::Iter; +use debug; use std::{cmp, fmt, mem, hash, ops, slice, ptr, usize}; use std::borrow::Borrow; @@ -722,7 +723,7 @@ impl Eq for Bytes { impl fmt::Debug for Bytes { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - fmt::Debug::fmt(&self.inner.as_ref(), fmt) + fmt::Debug::fmt(&debug::BsDebug(&self.inner.as_ref()), fmt) } } @@ -1260,7 +1261,7 @@ impl Eq for BytesMut { impl fmt::Debug for BytesMut { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - fmt::Debug::fmt(self.inner.as_ref(), fmt) + fmt::Debug::fmt(&debug::BsDebug(&self.inner.as_ref()), fmt) } } diff --git a/src/debug.rs b/src/debug.rs new file mode 100644 index 0000000..abead05 --- /dev/null +++ b/src/debug.rs @@ -0,0 +1,40 @@ +use std::fmt; + +/// Alternative implementation of `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. +/// +/// This struct wraps `&[u8]` just to override `fmt::Debug`. +/// +/// `BsDebug` is not a part of public API of bytes crate. +pub struct BsDebug<'a>(pub &'a [u8]); + +impl<'a> fmt::Debug for BsDebug<'a> { + fn fmt(&self, fmt: &mut fmt::Formatter) -> Result<(), fmt::Error> { + try!(write!(fmt, "b\"")); + for &c in self.0 { + // https://doc.rust-lang.org/reference.html#byte-escapes + if c == b'\n' { + try!(write!(fmt, "\\n")); + } else if c == b'\r' { + try!(write!(fmt, "\\r")); + } else if c == b'\t' { + try!(write!(fmt, "\\t")); + } else if c == b'\\' || c == b'"' { + try!(write!(fmt, "\\{}", c as char)); + } else if c == b'\0' { + try!(write!(fmt, "\\0")); + // ASCII printable except space + } else if c > 0x20 && c < 0x7f { + try!(write!(fmt, "{}", c as char)); + } else { + try!(write!(fmt, "\\x{:02x}", c)); + } + } + try!(write!(fmt, "\"")); + Ok(()) + } +} @@ -89,6 +89,7 @@ pub use buf::{ }; mod bytes; +mod debug; pub use bytes::{Bytes, BytesMut}; pub use byteorder::{ByteOrder, BigEndian, LittleEndian}; |