From 3853a1fac492a4077aae55d86efe978c18cc8083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E6=B5=A6=E6=9C=88?= Date: Fri, 24 Jan 2020 02:08:40 +0800 Subject: [PATCH] merge `hex` & `debug` into `fmt` (#357) --- src/bytes.rs | 7 ------- src/bytes_mut.rs | 7 ------- src/debug.rs | 40 ------------------------------------ src/fmt/debug.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++ src/{ => fmt}/hex.rs | 12 +++++------ src/fmt/mod.rs | 5 +++++ src/lib.rs | 3 +-- 7 files changed, 61 insertions(+), 62 deletions(-) delete mode 100644 src/debug.rs create mode 100644 src/fmt/debug.rs rename src/{ => fmt}/hex.rs (81%) create mode 100644 src/fmt/mod.rs diff --git a/src/bytes.rs b/src/bytes.rs index 0ca6138..d70852a 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -6,7 +6,6 @@ use alloc::{vec::Vec, string::String, boxed::Box, borrow::Borrow}; use crate::Buf; use crate::buf::IntoIter; -use crate::debug; use crate::loom::sync::atomic::{self, AtomicPtr, AtomicUsize, Ordering}; /// A reference counted contiguous slice of memory. @@ -496,12 +495,6 @@ impl Clone for Bytes { } } -impl fmt::Debug for Bytes { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt::Debug::fmt(&debug::BsDebug(&self.as_slice()), f) - } -} - impl Buf for Bytes { #[inline] fn remaining(&self) -> usize { diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index c3131a3..dc4e4b1 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -9,7 +9,6 @@ use alloc::{vec::Vec, string::String, boxed::Box, borrow::{Borrow, BorrowMut}}; use crate::{Bytes, Buf, BufMut}; use crate::bytes::Vtable; use crate::buf::IntoIter; -use crate::debug; use crate::loom::sync::atomic::{self, AtomicPtr, AtomicUsize, Ordering}; /// A unique reference to a contiguous slice of memory. @@ -1074,12 +1073,6 @@ impl Default for BytesMut { } } -impl fmt::Debug for BytesMut { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt::Debug::fmt(&debug::BsDebug(&self.as_slice()), fmt) - } -} - impl hash::Hash for BytesMut { fn hash(&self, state: &mut H) where H: hash::Hasher { let s: &[u8] = self.as_ref(); diff --git a/src/debug.rs b/src/debug.rs deleted file mode 100644 index b1a3cc8..0000000 --- a/src/debug.rs +++ /dev/null @@ -1,40 +0,0 @@ -use core::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 fmt::Debug for BsDebug<'_> { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> { - write!(fmt, "b\"")?; - for &c in self.0 { - // https://doc.rust-lang.org/reference.html#byte-escapes - if c == b'\n' { - write!(fmt, "\\n")?; - } else if c == b'\r' { - write!(fmt, "\\r")?; - } else if c == b'\t' { - write!(fmt, "\\t")?; - } else if c == b'\\' || c == b'"' { - write!(fmt, "\\{}", c as char)?; - } else if c == b'\0' { - write!(fmt, "\\0")?; - // ASCII printable - } else if c >= 0x20 && c < 0x7f { - write!(fmt, "{}", c as char)?; - } else { - write!(fmt, "\\x{:02x}", c)?; - } - } - write!(fmt, "\"")?; - Ok(()) - } -} 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/hex.rs b/src/fmt/hex.rs similarity index 81% rename from src/hex.rs rename to src/fmt/hex.rs index 48ae6a4..09170ae 100644 --- a/src/hex.rs +++ b/src/fmt/hex.rs @@ -1,20 +1,20 @@ -use crate::{Bytes, BytesMut}; use core::fmt::{Formatter, LowerHex, Result, UpperHex}; -struct BytesRef<'a>(&'a [u8]); +use crate::{Bytes, BytesMut}; +use super::BytesRef; -impl<'a> LowerHex for BytesRef<'a> { +impl LowerHex for BytesRef<'_> { fn fmt(&self, f: &mut Formatter<'_>) -> Result { - for b in self.0 { + for &b in self.0 { write!(f, "{:02x}", b)?; } Ok(()) } } -impl<'a> UpperHex for BytesRef<'a> { +impl UpperHex for BytesRef<'_> { fn fmt(&self, f: &mut Formatter<'_>) -> Result { - for b in self.0 { + for &b in self.0 { write!(f, "{:02X}", b)?; } Ok(()) 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]); diff --git a/src/lib.rs b/src/lib.rs index 2df1fb3..cab0210 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -86,8 +86,7 @@ pub use crate::buf::{ mod bytes_mut; mod bytes; -mod debug; -mod hex; +mod fmt; mod loom; pub use crate::bytes_mut::BytesMut; pub use crate::bytes::Bytes;