ぶていのログでぶログ

思い出したが吉日

Rust: assertの出力に色を付ける

before/after

cargo testで大きめの構造体をassertすると↑のbefore画像みたいにとても長い出力になる。 長すぎてどこに差分があるかわからなくてとても苦労する。 そこで、afterのように色をつけるスクリプトを作ってみた。

#!/usr/bin/env ruby

require 'tempfile'

while line = gets
  unless line.start_with?("  left:")
    puts line
    next
  end

  left = Tempfile.open("color-assert-left") {|fp| fp.puts line; fp}
  right = Tempfile.open("color-assert-right") {|fp| fp.puts gets; fp}

  puts `diff -u #{left.path} #{right.path} | delta --no-gitconfig --file-style=omit --hunk-header-style=omit --max-line-length=65535 --minus-style="red bold" --plus-style="green bold" | tail +2`

  left.delete
  right.delete
end

内部的にはdiffとdeltaを使っている。 deltaを選んだのは手元の環境で単語単位で色付けできるdiffツールがこれだけだったからである。 diffを介しているのはなぜかRubyから直接deltaを呼び出すとうまく動かなかったからである。謎い。

使い方は単純にcargo testの出力をパイプするだけである。

$ cargo test | ./color-assert.rb

出力例↓

シュッと作れるのでRubyで作ってしまったがcargoのサブコマンドで作るか〜っと考えたけど、色付けが必要な場面ってそんなに多いかなぁっと思いそして、今作っている自作シェルの方の開発を優先したく見送った。 また、同じ場面がでたら考えよう。