Skip to main content

smol_bytes/buffer/
fmt.rs

1use super::Buffer;
2
3impl core::fmt::Debug for Buffer {
4  // The code is copied from the bytes crate's Debug implementation.
5  fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
6    let slice = self.as_slice();
7    write!(f, "b\"")?;
8    for &b in slice {
9      // https://doc.rust-lang.org/reference/tokens.html#byte-escapes
10      if b == b'\n' {
11        write!(f, "\\n")?;
12      } else if b == b'\r' {
13        write!(f, "\\r")?;
14      } else if b == b'\t' {
15        write!(f, "\\t")?;
16      } else if b == b'\\' || b == b'"' {
17        write!(f, "\\{}", b as char)?;
18      } else if b == b'\0' {
19        write!(f, "\\0")?;
20      // ASCII printable
21      } else if (0x20..0x7f).contains(&b) {
22        write!(f, "{}", b as char)?;
23      } else {
24        write!(f, "\\x{:02x}", b)?;
25      }
26    }
27    write!(f, "\"")?;
28    Ok(())
29  }
30}
31
32impl core::fmt::LowerHex for Buffer {
33  fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
34    for &b in self.as_slice() {
35      write!(f, "{:02x}", b)?;
36    }
37    Ok(())
38  }
39}
40
41impl core::fmt::UpperHex for Buffer {
42  fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
43    for &b in self.as_slice() {
44      write!(f, "{:02X}", b)?;
45    }
46    Ok(())
47  }
48}
49
50impl core::fmt::Write for Buffer {
51  #[cfg_attr(not(coverage), inline(always))]
52  fn write_str(&mut self, s: &str) -> core::fmt::Result {
53    if self.remaining_mut() >= s.len() {
54      self.put_slice(s.as_bytes());
55      Ok(())
56    } else {
57      Err(core::fmt::Error)
58    }
59  }
60}