tracing_subscriber/fmt/format/
escape.rs1use std::fmt::{self, Write};
4
5pub(super) struct Escape<T>(pub(super) T);
8
9struct EscapingWriter<'a, 'b> {
11 inner: &'a mut fmt::Formatter<'b>,
12}
13
14impl<'a, 'b> fmt::Write for EscapingWriter<'a, 'b> {
15 fn write_str(&mut self, s: &str) -> fmt::Result {
16 for ch in s.chars() {
18 match ch {
19 '\x1b' => self.inner.write_str("\\x1b")?, '\x07' => self.inner.write_str("\\x07")?, '\x08' => self.inner.write_str("\\x08")?, '\x0c' => self.inner.write_str("\\x0c")?, '\x7f' => self.inner.write_str("\\x7f")?, ch if ch as u32 >= 0x80 && ch as u32 <= 0x9f => {
29 write!(self.inner, "\\u{{{:x}}}", ch as u32)?
30 },
31
32 _ => self.inner.write_char(ch)?,
33 }
34 }
35 Ok(())
36 }
37}
38
39impl<T: fmt::Debug> fmt::Debug for Escape<T> {
40 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41 let mut escaping_writer = EscapingWriter { inner: f };
42 write!(escaping_writer, "{:?}", self.0)
43 }
44}
45
46impl<T: fmt::Display> fmt::Display for Escape<T> {
47 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
48 let mut escaping_writer = EscapingWriter { inner: f };
49 write!(escaping_writer, "{}", self.0)
50 }
51}