joというJSONを組み立てるコマンドがあって、これは2016年からある便利なCLIツールなのですが、昨日急に思い立ってGo実装を作りました。
go get github.com/itchyny/gojo/cmd/gojo
brewでもインストールできます。
brew install itchyny/tap/gojo
使い方はこんな感じ。
$ gojo foo=bar qux=quux {"foo":"bar","qux":"quux"} $ gojo -p foo=bar qux=quux { "foo": "bar", "qux": "quux" } $ gojo -a foo bar baz ["foo","bar","baz"] $ seq 10 | gojo -a [1,2,3,4,5,6,7,8,9,10] $ gojo -p foo=$(gojo bar=$(gojo baz=100)) { "foo": { "bar": { "baz": 100 } } } $ curl -s https://httpbin.org/post -X POST \ -H 'Content-Type: application/json' \ -d "$(gojo foo=bar baz=$(gojo qux=128))" | jq .json { "baz": { "qux": 128 }, "foo": "bar" }
joはそれ自身と組み合わせて深いJSONを作るという考え方がとてもかわいくていいですね。
必要な機能はそんなに多くないので、思い立って三時間ほどで概ね実装できました。jo自体はあまり便利かどうか分からず使ったことはない*1のですが、自分で作ってみると意外と使い所があるかもと思っています。
GoのJSONは順序が失われてしまうので、順序を保存するためにorderedmapというライブラリーを使っています (が、若干バグを見つけたので報告しました)。
小さいツールなのでそこまで大したことはやってませんが、Go modulesやFunctional option patternを使ったりして今どきのGoの構成になっていると思うので、参考にしていただけると嬉しいです。
*1:実はjoのリリース当初にcontributeはしたことがあるんですが、正直言うと作者の設計方針が好きになれなかった