
io.circe.generic.semiauto.scala Maven / Gradle / Ivy
package io.circe.generic
import io.circe.{ Decoder, ObjectEncoder }
import io.circe.generic.decoding.{ DerivedDecoder, ReprDecoder }
import io.circe.generic.encoding.DerivedObjectEncoder
import io.circe.generic.util.PatchWithOptions
import shapeless.{ HList, LabelledGeneric, Lazy }
import shapeless.ops.function.FnFromProduct
import shapeless.ops.record.RemoveAll
/**
* Semi-automatic codec derivation.
*
* This object provides helpers for creating [[io.circe.Decoder]] and [[io.circe.ObjectEncoder]]
* instances for case classes, "incomplete" case classes, sealed trait hierarchies, etc.
*
* Typical usage will look like the following:
*
* {{{
* import io.circe._, io.circe.generic.semiauto._
*
* case class Foo(i: Int, p: (String, Double))
*
* object Foo {
* implicit val decodeFoo: Decoder[Foo] = deriveDecoder[Foo]
* implicit val encodeFoo: ObjectEncoder[Foo] = deriveEncoder[Foo]
* }
* }}}
*/
final object semiauto {
final def deriveDecoder[A](implicit decode: Lazy[DerivedDecoder[A]]): Decoder[A] = decode.value
final def deriveEncoder[A](implicit encode: Lazy[DerivedObjectEncoder[A]]): ObjectEncoder[A] = encode.value
final def deriveFor[A]: DerivationHelper[A] = new DerivationHelper[A]
final class DerivationHelper[A] {
final def incomplete[P <: HList, C, T <: HList, R <: HList](implicit
ffp: FnFromProduct.Aux[P => C, A],
gen: LabelledGeneric.Aux[C, T],
removeAll: RemoveAll.Aux[T, P, (P, R)],
decode: ReprDecoder[R]
): Decoder[A] = DerivedDecoder.decodeIncompleteCaseClass[A, P, C, T, R]
final def patch[R <: HList, O <: HList](implicit
gen: LabelledGeneric.Aux[A, R],
patch: PatchWithOptions.Aux[R, O],
decode: ReprDecoder[O]
): Decoder[A => A] = DerivedDecoder.decodeCaseClassPatch[A, R, O]
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy