Skip to content

Instantly share code, notes, and snippets.

@felher
Last active March 20, 2020 10:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save felher/80df90315383b320c2ed79129aa9df72 to your computer and use it in GitHub Desktop.
Save felher/80df90315383b320c2ed79129aa9df72 to your computer and use it in GitHub Desktop.
example circe generic extra configured json codec adt
{
"street" : "street",
"streetNumber" : 3,
"zip" : 3,
"kind" : "HomeAddress"
}
{
"street" : "pickupstreet",
"streetNumber" : 3,
"zip" : 3,
"kind" : "PickupStation"
}
{
"mail" : "a@b.de",
"kind" : "Mail"
}
Right(PickupStation(pickupstreet,3,3))
package org.felher.tmpNvkhHSWXMk
import io.circe.syntax._
import io.circe.parser._
import io.circe._
import io.circe.generic.extras._
import cats.implicits._
object Main {
def main(args: Array[String]): Unit = {
//Encoder is not contra-variant.
implicit def narrow[A <: ContactInformation](implicit enc: Encoder[ContactInformation]): Encoder[A] = enc.narrow[A]
println(HomeAddress("street", 3, 3).asJson);
println(PickupStation("pickupstreet", 3, 3).asJson);
println(Mail("a@b.de").asJson);
println(decode[ContactInformation](PickupStation("pickupstreet", 3, 3).asJson.spaces2))
}
}
@ConfiguredJsonCodec()
sealed trait ContactInformation
sealed trait Postal extends ContactInformation
final case class HomeAddress(street: String, streetNumber: Int, zip: Int) extends Postal
final case class PickupStation(street: String, streetNumber: Int, zip: Int) extends Postal
final case class Mail(mail: String) extends ContactInformation
package org.felher;
import io.circe.generic.extras.Configuration
package object tmpNvkhHSWXMk {
implicit val customConfig: Configuration = Configuration.default.withDiscriminator("kind")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment