joのGo実装 gojo を作りました!

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はしたことがあるんですが、正直言うと作者の設計方針が好きになれなかった