Skip to content

Instantly share code, notes, and snippets.

@pshirshov
Created March 16, 2018 16:52
Show Gist options
  • Save pshirshov/1c7defbe4b19757cb572f00e60f9f127 to your computer and use it in GitHub Desktop.
Save pshirshov/1c7defbe4b19757cb572f00e60f9f127 to your computer and use it in GitHub Desktop.
Circe with generic types
import io.circe._
import io.circe.parser._
import io.circe.syntax._
import io.circe.generic.decoding._
import io.circe.generic.encoding._
import io.circe.generic.semiauto._
case class GenericModel[Payload](payload: Payload, value: String)
case class TestPayload()
case class RealPayload()
trait CirceCodec[P] {
type Payload = P
implicit def dec0: Decoder[Payload]
implicit def enc0: Encoder[Payload]
implicit def dec1: Decoder[GenericModel[Payload]]
implicit def enc1: Encoder[GenericModel[Payload]]
}
class CirceCodecPolyImpl
[
P: DerivedObjectEncoder : DerivedDecoder
] extends CirceCodec[P] {
implicit def dec0: Decoder[Payload] = deriveDecoder
implicit def enc0: Encoder[Payload] = deriveEncoder
implicit def dec1: Decoder[GenericModel[Payload]] = deriveDecoder
implicit def enc1: Encoder[GenericModel[Payload]] = deriveEncoder
}
object RealCodec extends CirceCodecPolyImpl[RealPayload]
object TestCodec extends CirceCodecPolyImpl[TestPayload]
object Test {
def test1(): Unit = {
import RealCodec._
println(parse(GenericModel[RealPayload](RealPayload(), "test1").asJson.noSpaces))
}
def test2(): Unit = {
import TestCodec._
println(parse(GenericModel[TestPayload](TestPayload(), "test2").asJson.noSpaces))
}
}
Test.test1()
Test.test2()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment