diff options
author | Chih-Hung Hsieh <chh@google.com> | 2020-06-10 20:15:59 -0700 |
---|---|---|
committer | Chih-Hung Hsieh <chh@google.com> | 2020-06-10 20:15:59 -0700 |
commit | 01ae379526218e7f6ca28510b6c06098419b7380 (patch) | |
tree | ded7cfd36c57807924e0b2e62439a8df9f6d32c1 /src/fmt | |
parent | 7457df12a2eb70afcfa283968f7d1fadf123b0a1 (diff) | |
download | bytes-01ae379526218e7f6ca28510b6c06098419b7380.tar.gz |
Import bytes-0.5.4
* Add OWNERS and Android.bp
Bug: 143953733
Test: make
Change-Id: Ica69d7252abb1c2967f2c0e11a62d0bd83192fb3
Diffstat (limited to 'src/fmt')
-rw-r--r-- | src/fmt/debug.rs | 49 | ||||
-rw-r--r-- | src/fmt/hex.rs | 37 | ||||
-rw-r--r-- | src/fmt/mod.rs | 5 |
3 files changed, 91 insertions, 0 deletions
diff --git a/src/fmt/debug.rs b/src/fmt/debug.rs new file mode 100644 index 0000000..f6a08b8 --- /dev/null +++ b/src/fmt/debug.rs @@ -0,0 +1,49 @@ +use core::fmt::{Debug, Formatter, Result}; + +use crate::{Bytes, BytesMut}; +use super::BytesRef; + +/// 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) + } +} diff --git a/src/fmt/hex.rs b/src/fmt/hex.rs new file mode 100644 index 0000000..09170ae --- /dev/null +++ b/src/fmt/hex.rs @@ -0,0 +1,37 @@ +use core::fmt::{Formatter, LowerHex, Result, UpperHex}; + +use crate::{Bytes, BytesMut}; +use super::BytesRef; + +impl LowerHex for BytesRef<'_> { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + for &b in self.0 { + write!(f, "{:02x}", b)?; + } + Ok(()) + } +} + +impl UpperHex for BytesRef<'_> { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + for &b in self.0 { + write!(f, "{:02X}", b)?; + } + Ok(()) + } +} + +macro_rules! hex_impl { + ($tr:ident, $ty:ty) => { + impl $tr for $ty { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + $tr::fmt(&BytesRef(self.as_ref()), f) + } + } + }; +} + +hex_impl!(LowerHex, Bytes); +hex_impl!(LowerHex, BytesMut); +hex_impl!(UpperHex, Bytes); +hex_impl!(UpperHex, BytesMut); diff --git a/src/fmt/mod.rs b/src/fmt/mod.rs new file mode 100644 index 0000000..676d15f --- /dev/null +++ b/src/fmt/mod.rs @@ -0,0 +1,5 @@ +mod debug; +mod hex; + +/// `BytesRef` is not a part of public API of bytes crate. +struct BytesRef<'a>(&'a [u8]); |