Provide fmt::Write API
stefnotch opened this issue · comments
The crate tracing-subscriber might switch to using owo-colors. ( tokio-rs/tracing#2759 )
I tried implementing it, but stumbled upon a tricky case. Essentially tracing-subscriber is outputting values to a core::fmt::Write
, and it wants to call fmt_prefix
before that and fmt_suffix
after that.[1]
However, the fmt_prefix
and fmt_suffix
methods assume that one has a std::fmt::Formatter
. Which isn't the case here. The code is roughly
write!(writer, "{}", style.prefix())?;
// Directly prints to the writer. No instance of std::fmt::Formatter exists here.
self.timer.format_time(writer)
write!(writer, "{} ", style.suffix())?;
Would it be reasonable to change the fmt_prefix
/fmt_suffix
methods to accept anything that implements fmt::Write
? Or is there another, potentially better solution?
I'm currently using the following workaround. Ended up being surprisingly neat.
struct FormatTimeDisplay<T>(T);
impl<T: FormatTime> fmt::Display for FormatTimeDisplay<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.0.format_time(&mut Writer::new(f)).is_err() {
f.write_str("<unknown time>")
} else {
Ok(())
}
}
}