evolution-gaming / derivation

Configured derivation library for scala 3
MIT License
35 stars 6 forks source link

Provide more user friendly way to derive codecs #25

Open kpodsiad opened 2 years ago

kpodsiad commented 2 years ago

Annotation based configuration is super useful, but it might be hard to use in cases when one's datatypes are part of e.g. public API and are shared among few apps. Bringing circe, cats and friends into scope is almost impossible.

Of course one can use derived methods explicitly, but it's not as convenient as using circe's deriveConfiguredCodec and similar. Snippet included to issue doesn't use any configuration options but each one of them will require additional codes which is not easy to write as there are almost no comments in sources.

Reproduction uses scala-cli and locally published version of library.

//> using scala "3.2.0"
//> using lib "com.evolution::derivation-circe:0.1-fd8fba2a1f9529f0adc55912129fe9a6974918fc-SNAPSHOT"

import evo.derivation.*
import evo.derivation.circe.*
import evo.derivation.config.Config
import io.circe.Codec

final case class MyDataType(foo: String, bar: Int)

object MyDataType:
  implicit val actionCodec: Codec[MyDataType] =
    EvoCodec.derived[MyDataType](using Config.derived[MyDataType]) 
Odomontois commented 1 year ago

Yeah, the lib is definitely supposed to be used when you need to write some of your derivation by hand. I think, the the desired usage would be something like

object MyDataType:
  given Config[MyDataType] = Config.derived.copy(...) // some user customizations here
  given Codec[MyDataType] = EvoCodec.derived

If that suits you we can think of a better set of methods for config to make configuration easier.

Moreover, the derivation core is supposed to be a lightweight library so that one can use it in the "Public API" part. It doesn't mention any circe, etc. parts. So I still think that one can use annotations even in public API with no commitment to serialization\schema library