|
@@ -160,6 +160,20 @@ where
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+pub struct LowerHexDebugFormatter;
|
|
|
+impl<T> Formatter<&[T]> for LowerHexDebugFormatter
|
|
|
+where
|
|
|
+ T: LowerHex,
|
|
|
+{
|
|
|
+ fn format(v: &[T]) -> String {
|
|
|
+ let mut s = String::new();
|
|
|
+ for v in v {
|
|
|
+ let () = core::fmt::write(&mut s, format_args!("{v:x}")).unwrap();
|
|
|
+ }
|
|
|
+ s
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
pub struct UpperHexFormatter;
|
|
|
impl<T> Formatter<T> for UpperHexFormatter
|
|
|
where
|
|
@@ -170,6 +184,20 @@ where
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+pub struct UpperHexDebugFormatter;
|
|
|
+impl<T> Formatter<&[T]> for UpperHexDebugFormatter
|
|
|
+where
|
|
|
+ T: UpperHex,
|
|
|
+{
|
|
|
+ fn format(v: &[T]) -> String {
|
|
|
+ let mut s = String::new();
|
|
|
+ for v in v {
|
|
|
+ let () = core::fmt::write(&mut s, format_args!("{v:X}")).unwrap();
|
|
|
+ }
|
|
|
+ s
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
pub struct Ipv4Formatter;
|
|
|
impl<T> Formatter<T> for Ipv4Formatter
|
|
|
where
|
|
@@ -214,6 +242,16 @@ trait Format {
|
|
|
fn format(&self, last_hint: Option<DisplayHintWrapper>) -> Result<String, ()>;
|
|
|
}
|
|
|
|
|
|
+impl Format for &[u8] {
|
|
|
+ fn format(&self, last_hint: Option<DisplayHintWrapper>) -> Result<String, ()> {
|
|
|
+ match last_hint.map(|DisplayHintWrapper(dh)| dh) {
|
|
|
+ Some(DisplayHint::LowerHex) => Ok(LowerHexDebugFormatter::format(self)),
|
|
|
+ Some(DisplayHint::UpperHex) => Ok(UpperHexDebugFormatter::format(self)),
|
|
|
+ _ => Err(()),
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
impl Format for u32 {
|
|
|
fn format(&self, last_hint: Option<DisplayHintWrapper>) -> Result<String, ()> {
|
|
|
match last_hint.map(|DisplayHintWrapper(dh)| dh) {
|
|
@@ -499,6 +537,9 @@ fn log_buf(mut buf: &[u8], logger: &dyn Log) -> Result<(), ()> {
|
|
|
}
|
|
|
full_log_msg.push_str(&value.format(last_hint.take())?);
|
|
|
}
|
|
|
+ Argument::Bytes => {
|
|
|
+ full_log_msg.push_str(&value.format(last_hint.take())?);
|
|
|
+ }
|
|
|
Argument::Str => match str::from_utf8(value) {
|
|
|
Ok(v) => {
|
|
|
full_log_msg.push_str(v);
|
|
@@ -568,11 +609,11 @@ mod test {
|
|
|
#[test]
|
|
|
fn test_str() {
|
|
|
testing_logger::setup();
|
|
|
- let (len, mut input) = new_log(1).unwrap();
|
|
|
+ let (mut len, mut input) = new_log(1).unwrap();
|
|
|
|
|
|
- "test"
|
|
|
- .write(&mut input[len..])
|
|
|
- .expect("could not write to the buffer");
|
|
|
+ len += "test".write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
|
|
|
let logger = logger();
|
|
|
let () = log_buf(&input, logger).unwrap();
|
|
@@ -588,10 +629,10 @@ mod test {
|
|
|
testing_logger::setup();
|
|
|
let (mut len, mut input) = new_log(2).unwrap();
|
|
|
|
|
|
- len += "hello "
|
|
|
- .write(&mut input[len..])
|
|
|
- .expect("could not write to the buffer");
|
|
|
- "test".write(&mut input[len..]).unwrap();
|
|
|
+ len += "hello ".write(&mut input[len..]).unwrap();
|
|
|
+ len += "test".write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
|
|
|
let logger = logger();
|
|
|
let () = log_buf(&input, logger).unwrap();
|
|
@@ -602,6 +643,49 @@ mod test {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ #[test]
|
|
|
+ fn test_bytes() {
|
|
|
+ testing_logger::setup();
|
|
|
+ let (mut len, mut input) = new_log(2).unwrap();
|
|
|
+
|
|
|
+ len += DisplayHint::LowerHex.write(&mut input[len..]).unwrap();
|
|
|
+ len += [0xde, 0xad].write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
+
|
|
|
+ let logger = logger();
|
|
|
+ let () = log_buf(&input, logger).unwrap();
|
|
|
+ testing_logger::validate(|captured_logs| {
|
|
|
+ assert_eq!(captured_logs.len(), 1);
|
|
|
+ assert_eq!(captured_logs[0].body, "dead");
|
|
|
+ assert_eq!(captured_logs[0].level, Level::Info);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ #[test]
|
|
|
+ fn test_bytes_with_args() {
|
|
|
+ testing_logger::setup();
|
|
|
+ let (mut len, mut input) = new_log(5).unwrap();
|
|
|
+
|
|
|
+ len += DisplayHint::LowerHex.write(&mut input[len..]).unwrap();
|
|
|
+ len += [0xde, 0xad].write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ len += " ".write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ len += DisplayHint::UpperHex.write(&mut input[len..]).unwrap();
|
|
|
+ len += [0xbe, 0xef].write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
+
|
|
|
+ let logger = logger();
|
|
|
+ let () = log_buf(&input, logger).unwrap();
|
|
|
+ testing_logger::validate(|captured_logs| {
|
|
|
+ assert_eq!(captured_logs.len(), 1);
|
|
|
+ assert_eq!(captured_logs[0].body, "dead BEEF");
|
|
|
+ assert_eq!(captured_logs[0].level, Level::Info);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
#[test]
|
|
|
fn test_display_hint_default() {
|
|
|
testing_logger::setup();
|
|
@@ -609,7 +693,9 @@ mod test {
|
|
|
|
|
|
len += "default hint: ".write(&mut input[len..]).unwrap();
|
|
|
len += DisplayHint::Default.write(&mut input[len..]).unwrap();
|
|
|
- 14.write(&mut input[len..]).unwrap();
|
|
|
+ len += 14.write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
|
|
|
let logger = logger();
|
|
|
let () = log_buf(&input, logger).unwrap();
|
|
@@ -627,7 +713,9 @@ mod test {
|
|
|
|
|
|
len += "lower hex: ".write(&mut input[len..]).unwrap();
|
|
|
len += DisplayHint::LowerHex.write(&mut input[len..]).unwrap();
|
|
|
- 200.write(&mut input[len..]).unwrap();
|
|
|
+ len += 200.write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
|
|
|
let logger = logger();
|
|
|
let () = log_buf(&input, logger).unwrap();
|
|
@@ -645,7 +733,9 @@ mod test {
|
|
|
|
|
|
len += "upper hex: ".write(&mut input[len..]).unwrap();
|
|
|
len += DisplayHint::UpperHex.write(&mut input[len..]).unwrap();
|
|
|
- 200.write(&mut input[len..]).unwrap();
|
|
|
+ len += 200.write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
|
|
|
let logger = logger();
|
|
|
let () = log_buf(&input, logger).unwrap();
|
|
@@ -664,7 +754,9 @@ mod test {
|
|
|
len += "ipv4: ".write(&mut input[len..]).unwrap();
|
|
|
len += DisplayHint::Ipv4.write(&mut input[len..]).unwrap();
|
|
|
// 10.0.0.1 as u32
|
|
|
- 167772161u32.write(&mut input[len..]).unwrap();
|
|
|
+ len += 167772161u32.write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
|
|
|
let logger = logger();
|
|
|
let () = log_buf(&input, logger).unwrap();
|
|
@@ -687,7 +779,9 @@ mod test {
|
|
|
0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
|
|
|
0x00, 0x01,
|
|
|
];
|
|
|
- ipv6_arr.write(&mut input[len..]).unwrap();
|
|
|
+ len += ipv6_arr.write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
|
|
|
let logger = logger();
|
|
|
let () = log_buf(&input, logger).unwrap();
|
|
@@ -709,7 +803,9 @@ mod test {
|
|
|
let ipv6_arr: [u16; 8] = [
|
|
|
0x2001, 0x0db8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001,
|
|
|
];
|
|
|
- ipv6_arr.write(&mut input[len..]).unwrap();
|
|
|
+ len += ipv6_arr.write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
|
|
|
let logger = logger();
|
|
|
let () = log_buf(&input, logger).unwrap();
|
|
@@ -729,7 +825,9 @@ mod test {
|
|
|
len += DisplayHint::LowerMac.write(&mut input[len..]).unwrap();
|
|
|
// 00:00:5e:00:53:af as byte array
|
|
|
let mac_arr: [u8; 6] = [0x00, 0x00, 0x5e, 0x00, 0x53, 0xaf];
|
|
|
- mac_arr.write(&mut input[len..]).unwrap();
|
|
|
+ len += mac_arr.write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
|
|
|
let logger = logger();
|
|
|
let () = log_buf(&input, logger).unwrap();
|
|
@@ -749,7 +847,9 @@ mod test {
|
|
|
len += DisplayHint::UpperMac.write(&mut input[len..]).unwrap();
|
|
|
// 00:00:5E:00:53:AF as byte array
|
|
|
let mac_arr: [u8; 6] = [0x00, 0x00, 0x5e, 0x00, 0x53, 0xaf];
|
|
|
- mac_arr.write(&mut input[len..]).unwrap();
|
|
|
+ len += mac_arr.write(&mut input[len..]).unwrap();
|
|
|
+
|
|
|
+ _ = len;
|
|
|
|
|
|
let logger = logger();
|
|
|
let () = log_buf(&input, logger).unwrap();
|