shapelessのHListとScalazを組み合わせて23要素以上のcase classのPlay2のJsonのReadsを作る

「Scala2.11になっても、23要素以上のcase classを直接jsonマッピングとかできないの!」とお怒りの皆さんこんばんは。タイトル長いですね。
タイトル通りのもの作りました。こちら完成品のサンプルコードです

https://github.com/xuwei-k/play2-json-twenty-three

実は、ほぼ同じこと他の人がすでにやっているんですが


http://mandubian.com/2014/01/31/play-rules-shapeless/
https://github.com/mandubian/shapeless-rules

まぁなんとなく自分でやってみたかっただけです。あと、たぶんそれ独自Validation APIに依存しててあれだなーと思ったので。勘違いだったかも。
自分のやつは独自の「play2の型クラス と Scalaz型クラスの相互変換ライブラリ」に依存して書きました。


前提条件として

なので、ほとんど独自コード書かずにいけるだろーと思いきや、なんとshapeless-contribのshapeless2.0.0に依存してるversionでScala2.11対応がまだpublishされてなかったのだけど、なぜ・・・。
というわけで、必要な1ファイルだけ、ビルド時にダウンロードするようにしました。


それさえあれば、かなりDRYに書けますね。
あとは、shapeless2.0.0にはLabelledGenericというものがあり

https://github.com/milessabin/shapeless/blob/shapeless-2.0.0/core/src/test/scala/shapeless/labelledgeneric.scala

これ使うと、case classのfield名をマクロ経由で取得できる*1のですが、それ使うversionは、また気が向いたら書きます。
あと、これcase classのfieldの型を一旦書いてるけど、自分が作ったplay-json-extra

http://d.hatena.ne.jp/xuwei/20140402/1396408213

みたいに、型書かなくて済むようにできるかな?と考えたけど、まぁそれも気が向いたら・・・ 作りました http://d.hatena.ne.jp/xuwei/20140727/1406445058

*1:つまり、それをそのままjsonのkeyにするとか