RustでCLIツールを作ったりしていると、標準出力に色をつけたくなることがある。色をつけるためのライブラリは幾つかあるが、ここではowo-colorsというライブラリを紹介する。

owo-colorsの使い方を紹介する前に、Rustで文字列に色を付けるためのライブラリを幾つか記載しておく。

この中だと、coloredとowo-colorsはとてもシンプルに使うことができるので、とりあえず色をつけたいという人はどちらかを使ってみるのが良いと思う。coloredと比べてowo-colorsはno_std環境でも動作する、用意されている関数が多少多いといった利点がある。

owo-colorsを使った色の付け方

単純に文字列に色を付けるには、文字列から色名に対応したメソッドを呼ぶことで実現できる。以下は、条件に応じて緑と赤の色をつけて出力を行う例である。

use owo_colors::OwoColorize;

fn main() {
  // ...
  if is_successful {
    println!("{}", "Test Successful".green())
  } else {
    println!("{}", "Test Failed".red())
  }
}

他にも、blue, black, magentaなどの色が用意されている。詳細はこちらのrust-doc に用意されている関数について記されている。

また、上記のコードはジェネリクスを使用して以下のようにも書き換えられる。

use owo_colors::colors::*;
use owo_colors::OwoColorize;

fn main() {
  // ...
  if is_successful {
    println!("{}", "Test Successful".fg::<Green>())
  } else {
    println!("{}", "Test Failed".fg::<Red>())
  }
}

どちらでも得られる結果は一緒なので、好きな方を使用すると良い。また、用意されている色の他にも自分でRGB値を指定して色を付けることもできる。その場合は、以下のようにCustomColorを使用することで実現できる。

println!("{}", "something".fg::<CustomColor<32, 16, 128>())

文字の背景に色を付ける

文字自体の色の他にも、on_black などのonから始まる関数を使用することで文字の背景色を変更することができる。例えば、黒背景に白文字を使用したい場合は以下のようにメソッドチェインスタイルで記述することができる。

println!("{}", "something".white().on_black())

こちらも文字色と同様にジェネリクスを使用した書き方がある。上記を書き換えると以下のようになる。

println!("{}", "something".fg::<White>().bg::<Black>())

文字のスタイルを変更する

owo-colorsでは、文字色の他に文字のスタイルの変更にも対応している。ここで言うスタイルとは、斜体、太字、下線などである。それぞれ以下のように記述することができる。もちろん、文字色と組み合わせて使用することも可能だ。

println!("{}", "italic".italic());
println!("{}", "bold".bold());
println!("{}", "underline".underline());

自分が使うことはない気がするが、blink 関数でチカチカと点滅させたりできてちょっと面白い。