|
|
@ -204,15 +204,12 @@ where
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub struct LowerHexDebugFormatter;
|
|
|
|
pub struct LowerHexBytesFormatter;
|
|
|
|
impl<T> Formatter<&[T]> for LowerHexDebugFormatter
|
|
|
|
impl Formatter<&[u8]> for LowerHexBytesFormatter {
|
|
|
|
where
|
|
|
|
fn format(v: &[u8]) -> String {
|
|
|
|
T: LowerHex,
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
fn format(v: &[T]) -> String {
|
|
|
|
|
|
|
|
let mut s = String::new();
|
|
|
|
let mut s = String::new();
|
|
|
|
for v in v {
|
|
|
|
for v in v {
|
|
|
|
let () = core::fmt::write(&mut s, format_args!("{v:x}")).unwrap();
|
|
|
|
let () = core::fmt::write(&mut s, format_args!("{v:02x}")).unwrap();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
s
|
|
|
|
s
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -228,15 +225,12 @@ where
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub struct UpperHexDebugFormatter;
|
|
|
|
pub struct UpperHexBytesFormatter;
|
|
|
|
impl<T> Formatter<&[T]> for UpperHexDebugFormatter
|
|
|
|
impl Formatter<&[u8]> for UpperHexBytesFormatter {
|
|
|
|
where
|
|
|
|
fn format(v: &[u8]) -> String {
|
|
|
|
T: UpperHex,
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
fn format(v: &[T]) -> String {
|
|
|
|
|
|
|
|
let mut s = String::new();
|
|
|
|
let mut s = String::new();
|
|
|
|
for v in v {
|
|
|
|
for v in v {
|
|
|
|
let () = core::fmt::write(&mut s, format_args!("{v:X}")).unwrap();
|
|
|
|
let () = core::fmt::write(&mut s, format_args!("{v:02X}")).unwrap();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
s
|
|
|
|
s
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -289,8 +283,8 @@ trait Format {
|
|
|
|
impl Format for &[u8] {
|
|
|
|
impl Format for &[u8] {
|
|
|
|
fn format(&self, last_hint: Option<DisplayHintWrapper>) -> Result<String, ()> {
|
|
|
|
fn format(&self, last_hint: Option<DisplayHintWrapper>) -> Result<String, ()> {
|
|
|
|
match last_hint.map(|DisplayHintWrapper(dh)| dh) {
|
|
|
|
match last_hint.map(|DisplayHintWrapper(dh)| dh) {
|
|
|
|
Some(DisplayHint::LowerHex) => Ok(LowerHexDebugFormatter::format(self)),
|
|
|
|
Some(DisplayHint::LowerHex) => Ok(LowerHexBytesFormatter::format(self)),
|
|
|
|
Some(DisplayHint::UpperHex) => Ok(UpperHexDebugFormatter::format(self)),
|
|
|
|
Some(DisplayHint::UpperHex) => Ok(UpperHexBytesFormatter::format(self)),
|
|
|
|
_ => Err(()),
|
|
|
|
_ => Err(()),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -781,6 +775,36 @@ mod test {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
|
|
|
fn test_bytes_unambiguous() {
|
|
|
|
|
|
|
|
testing_logger::setup();
|
|
|
|
|
|
|
|
let (mut len, mut input) = new_log(5).unwrap();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
len += DisplayHint::LowerHex
|
|
|
|
|
|
|
|
.write(&mut input[len..])
|
|
|
|
|
|
|
|
.unwrap()
|
|
|
|
|
|
|
|
.get();
|
|
|
|
|
|
|
|
len += [0x01, 0x02].write(&mut input[len..]).unwrap().get();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
len += " ".write(&mut input[len..]).unwrap().get();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
len += DisplayHint::LowerHex
|
|
|
|
|
|
|
|
.write(&mut input[len..])
|
|
|
|
|
|
|
|
.unwrap()
|
|
|
|
|
|
|
|
.get();
|
|
|
|
|
|
|
|
len += [0x12].write(&mut input[len..]).unwrap().get();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_ = 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, "0102 12");
|
|
|
|
|
|
|
|
assert_eq!(captured_logs[0].level, Level::Info);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
#[test]
|
|
|
|
fn test_display_hint_default() {
|
|
|
|
fn test_display_hint_default() {
|
|
|
|
testing_logger::setup();
|
|
|
|
testing_logger::setup();
|
|
|
|