「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のHListはscalazのApplicativeのインスタンスとして使える
- 自分でplay2のApplicativeとScalazのApplicative変換するものは、以前作った https://github.com/xuwei-k/play2scalaz
- shapelessはcase classとHListの相互変換が可能
- shapeless2.0.0だとマクロ使ってるので、超DRYに簡単に変換できる
- 1.2.4だとマクロ使ってない、ので少しだけ面倒とかそんな感じ(うろ覚え)
なので、ほとんど独自コード書かずにいけるだろーと思いきや、なんとshapeless-contribのshapeless2.0.0に依存してるversionでScala2.11対応がまだpublishされてなかったのだけど、なぜ・・・。
というわけで、必要な1ファイルだけ、ビルド時にダウンロードするようにしました。
それさえあれば、かなりDRYに書けますね。
あとは、shapeless2.0.0にはLabelledGenericというものがあり
これ使うと、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