1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use std::fmt;

pub use custom_debug_derive::*;

/// Formats a buffer as hex using \xNN notation.
pub fn hexbuf(v: &impl AsRef<[u8]>, f: &mut fmt::Formatter) -> std::fmt::Result {
    write!(f, "b\"")?;

    for x in v.as_ref() {
        write!(f, "\\x{:02x}", x)?;
    }

    write!(f, "\"")?;

    Ok(())
}

/// Formats a buffer as hex using \xNN notation,
/// except for printable ascii characters.
pub fn hexbuf_str(v: &impl AsRef<[u8]>, f: &mut fmt::Formatter) -> std::fmt::Result {
    write!(f, "b\"")?;

    for x in v.as_ref() {
        match x {
            b'\\' => write!(f, "\\\\")?,
            b'"' => write!(f, "\\\"")?,
            b if b.is_ascii_graphic() => write!(f, "{}", *x as char)?,
            _ => write!(f, "\\x{:02x}", x)?,
        }
    }

    write!(f, "\"")?;

    Ok(())
}