Using owo_colors Extension Traits to colorize terminal output

Chris Biscardi
InstructorChris Biscardi

Share this video with your friends

Send Tweet

We can print lines to the terminal and ask the user for various input. So let's make the interface a bit more usable by using colored output.

We can do this by bringing an extension trait for formatting into scope: OwoColorize.

Extension traits are one-off traits that are used to add functions to a type that our crate doesn't own. A crate can create the new trait, then implement the functions defined by that trait on a type the crate doesn't own and if we bring that trait into scope, the type will get the extra functions. In this case, OwoColorize is used for adding color functions to formatters like Display and Debug.

We'll start with ask_for_filename

use color_eyre::owo_colors::OwoColorize;

fn ask_for_filename() -> Result<String> {
    rprompt::prompt_reply_stderr(&format!(
        "{}",
        "\
Enter filename
> "
        .blue()
        .bold(),
    ))
    .wrap_err("Failed to get filename")
    .map(|title| slug::slugify(title))
}

In confirm_filename we can use multiple formatters to get different colors:

let result = rprompt::prompt_reply_stderr(&format!(
    "\
{} {}
Do you want a different title? (y/N): ",
    "current title:".green().bold(),
    raw_title,
))
.wrap_err("Failed to get input for y/n question")?;