playframeworkのJsonのReadsやWritesやFormatで要素数が23以上の場合のcase class用のコード生成sbt pluginをつくった

タイトル長げーよ!!!


https://github.com/xuwei-k/play-twenty-three

以前書いたもの

252要素のcase classまでのplayframeworkのJsonのReadsやWritesやFormatを生成できるライブラリ作った

を、色々カスタマイズ可能にしてsbt pluginにしました。以前つくったものは、1から252まですべてのReads, Writes, Format用のメソッドという超大量のボイラプレートなコードを生成していたわけですが、

「バイナリサイズが11MB」

という残念な感じになっていました。たとえば大概は252なんて必要なくて、

「25要素のformatと、27要素のreads用メソッドが欲しいだけなんだけどな―」

という程度の需要でしょう。というわけで、必要なメソッドだけをユーザー側で生成するためのsbt pluginにしました。設定可能なのは

  • case classの要素数
  • 素数は、範囲とか、最大いくつまで、という指定方法のみならず、「25と28」などと、直接個別指定まで可能
  • readsのみか、writesのみか、format含めて全部か?
  • それぞれのclass名、メソッド名、オブジェクト名、パッケージ名
  • ビルダーのclassがfinalか?case classか?

など、思いつく箇所は(あまり必要なさそうなところ含めて)だいたい全部カスタマイズ可能にしておきました。ただ、メソッド名や、内部用のBuilderのclass名は普通どうでもよく、一番カスタマイズしたいのは、case classの要素数だと思うので、カスタマイズしたいであろうものだけを指定しやすいように、少しはヘルパーメソッド追加してあります。が、そのあたりはそれほど丁寧に書いてないし、少しわかりにくいかもしれません。
あとはこのあたり https://github.com/xuwei-k/play-twenty-three/tree/v0.1.2/generator/src/main/scala のソース読むか、どうしてもわからなかったら直接聞いてください。

sbt pluginなので、その部分はもちろんScala2.10で書くしかないわけですが、sbt関係ないコード生成部分はできるだけ切り離して、別のモジュールになっていて、そちらはScala2.10と2.11でcross buildしてpublishしてあります。


あとは、

他のJsonライブラリについても、気が向いたら似たようなことやろう
and
これも気が向いたら、GAEからAPIで返す感じのものを作ろう・・・つくった