sters/yaml-diff: Make a diff between 2 yaml files. を書き直した。
以前は、Unmarshalしたデータ同士を google/go-cmp: Package for comparing Go values in tests で比較して結果をそのまま出していたのでGoの記載でYAML感が全然なく、どこに差分があるのか全然わからなかった(自分でまったく使えなかった)
各フィールドを一個ずつみて、差分があれば差分だよ!とマークして、を繰り返せばいいだけであることはわかっていたものの、泥臭い作業が続きそうでなかなか気が回らなかった。ここ数日で気合いれてやるか!とやる気を出して集中して取り組んだら意外とあっさり終わったのでよかった。
これによって実装を始める前に想像していた通り、いい感じに差分が出るようになった。YAML区切り単位ごとでは、元の入力と順序が合うようになっているので差分探しも結構簡単なんじゃないかなと思う。
各フィールドの順序が合っていないのは心当たりがあるのでそのうち直す。 直した。v1.0.2でいい感じになっている、はず。
元の表記と合っていないのをなんとかするのは結構大変そうなので、これは…どうしようかな…。どうにかする方法がパッと浮かばないのでアイデアがあればIssueでもPRでもほしい。 goccy/go-yamlに同梱されているycatを参考に、そのPrinterを使えば行ける、かも??
https://github.com/goccy/go-yaml/blob/master/cmd/ycat/ycat.go
ところでこれがどこに便利なのかというと、個々のフィールドに対して判断していくので、単純にdiffを取ると差分がガタガタになるとか、構造がわからん!といったdiffでもうまく差分を出してくれる。主に ---
で分割されたYAMLに対して有効で、特に何かしらのYAMLジェネレーター(Kustomizationとか)を使ったときに効いてくる、はず。あとは差分が無いところも全部出してくれるので(diffコマンドでもできるけど)、全体像を見た上で差分がどこ、がわかりやすいというのもある。
YAML代替がいろいろ出てきている( CUE とか Jsonnet - The Data Templating Language とか)けれど、YAMLと暮らすこともまだまだあると思うので、そういったときに出番が来るといいな。