Я использую play-json для сопоставления Json с классами case или перечислениями. Я ищу умный способ неявного создания Formats
, поскольку мой проект содержит много определений типов.
На данный момент я создал простую функцию для генерации Formats
для Enums:
def formatEnum[E <: Enumeration](enum: E) = Format(Reads.enumNameReads(enum), Writes.enumNameWrites)
Но он принимает неявный аргумент, поэтому его нельзя использовать в качестве неявного преобразователя.
Я попытался сделать то же самое для case-классов:
implicit def caseFormat[A] = Json.format[A]
Но я получаю сообщение об ошибке «Не найдена функция unapply или unapplySeq», поскольку Json.format
- это макрос, проверяющий структуру класса.
Затем я попытался создать свой макрос таким образом:
import scala.language.experimental.macros
import scala.reflect.macros.whitebox.Context
implicit def caseFormat[A](): Format[A] = macro impl[A]
def impl[A: c.WeakTypeTag](c: Context)(): c.Expr[Reads[A]] = {
import c.universe._
val TypeRef(pre, sym, args) = weakTypeTag[A].tpe
val t = args.head
val expr = q"Json.format[$t]"
c.Expr[Reads[A]](expr)
}
Но компилятор не находит неявное Format
, хотя есть неявное def, которое должно генерировать значение.
Конечно, я могу просто определить многие неявные val, но я думаю, что есть более разумный способ сделать это.