diff --git a/src/hex.rs b/src/hex.rs new file mode 100644 index 0000000..d3fdafb --- /dev/null +++ b/src/hex.rs @@ -0,0 +1,37 @@ +use crate::{Bytes, BytesMut}; +use std::fmt::{Formatter, LowerHex, Result, UpperHex}; + +struct BytesRef<'a>(&'a [u8]); + +impl<'a> LowerHex for BytesRef<'a> { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + for b in self.0 { + write!(f, "{:02x}", b)?; + } + Ok(()) + } +} + +impl<'a> UpperHex for BytesRef<'a> { + 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/lib.rs b/src/lib.rs index 031a24c..84bccb2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -80,6 +80,7 @@ pub use crate::buf::{ mod bytes; mod debug; +mod hex; pub use crate::bytes::{Bytes, BytesMut}; // Optional Serde support