play-json-derived-codecs
play-json-derived-codecs copied to clipboard
make type renaming shorter
trafficstars
It seems like a lot of code just to e.g. rename Left and Right in Either:
def eitherFormat[L: Format, R: Format](typeMap: Map[String, String] = Map("Left" -> "Error", "Right" -> "Ok"))(
implicit
derivedReads: Lazy[DerivedReads[Either[L, R]]],
derivedOWrites: Lazy[DerivedOWrites[Either[L, R]]]): OFormat[Either[L, R]] = {
type A = Either[L, R]
val adapter = NameAdapter.identity
def eitherTypeTagReads(map: Map[String, String]): TypeTagReads =
new TypeTagReads {
def reads[A](typeName: String, reads: Reads[A]): Reads[A] =
(__ \ map.getOrElse(typeName, typeName)).read(reads)
}
def eitherTypeTagOWrites(map: Map[String, String]): TypeTagOWrites =
new TypeTagOWrites {
def owrites[A](typeName: String, owrites: OWrites[A]): OWrites[A] =
OWrites[A](a => Json.obj(map.getOrElse(typeName, typeName) -> owrites.writes(a)))
}
OFormat[A](
derivedReads.value.reads(eitherTypeTagReads(typeMap), adapter),
derivedOWrites.value.owrites(eitherTypeTagOWrites(typeMap), adapter))
}