maaash.jp

what I create

Uncomment JSON or using JSON5

最近あるプロジェクトで階層構造のある設定ファイルが必要になり、コメントを入れる必要からYAMLフォーマットを選択した。 だがYAMLはoctalの罠にハマった嫌な思い出がある。

Integer Language-Independent Type for YAML™ Version 1.1

1
2
3
4
5
6
7
Valid values must match the following regular expression, which may also be used for implicit tag resolution:
 
 [-+]?0b[0-1_]+ # (base 2)
|[-+]?0[0-7_]+ # (base 8)
|[-+]?(0|[1-9][0-9_]*) # (base 10)
|[-+]?0x[0-9a-fA-F_]+ # (base 16)
|[-+]?[1-9][0-9_]*(:[0-5]?[0-9])+ # (base 60)

0で始まり7までの数字だけであれば base 8 になり8以上の数字を含めば base 10 になるのは無しだろう。

YAML 1.2ではこの罠は無いが

それにどこかで読んだ、設定ファイルが途中で途切れたままデプロイされても文法エラーにならない、 という欠点は気になる。

コメントさえ使えればJSON使うのに… ということでシンプルなツールを書いた。

Uncomment | github.com/mash/uncomment

良いライブラリがあったので特に難しいことはしていない。 コマンドの引数やstdin,stdoutが他のツールと組み合わせやすいか、だけ気にして作った。

元々のあるプロジェクトではviperを使っていたので何も変えずに設定ファイルの食わせ方を変えるだけでコメントを含んだ緩いJSONを使えるようになる。

1
2
3
4
5
# パイプはよしなに扱う
% cat relaxed.json | uncomment | jq .

# -oでファイル名を指定するとstdoutにファイル名を書く
% command -c `uncomment -i relaxed.json -o strict.json`

ライブラリ選定中にJSON5というのを発見して、「これジャン!」となり、こりゃ欲しいツールは既にあるだろうな心のどこかで思いながらも最後まで走りきって作ってしまった。 案の定似たようなツールはたくさんあった

この小さなプロジェクトの気に入っている点は、良い名前をつけられたことかな。 パイプで繋いだ時の見え方、しっくりくるではないか。

Comments