jam1garner / owo-colors

A zero-allocation no_std-compatible zero-cost way to add color to your Rust terminal

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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?

[1]
https://github.com/tokio-rs/tracing/blob/908cc432a5994f6e17c8f36e13c217dc40085704/tracing-subscriber/src/fmt/format/mod.rs#L859-L868

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(())
        }
    }
}