Scala 3 Derivation
Scala 3 introduced native support for
type class derivation - a way to automatically
generate type class instances for enums, enum cases, case classes, case objects and sealed traits that only have the
aforementioned types as children. Instances are generated on demand by adding a derives
clause on data types.
PureConfig has some limited support for derivation of ConfigReader
instances. In order to enable it, the relevant
extensions must be imported:
import pureconfig._
import pureconfig.generic.derivation.default._
After that, you can derive ConfigReader
instances for your config class using a derives
clause:
sealed trait AnimalConf derives ConfigReader
case class DogConf(age: Int) extends AnimalConf
case class BirdConf(canFly: Boolean) extends AnimalConf
ConfigSource.string("{ type: dog-conf, age: 4 }").load[AnimalConf]
// val res0: pureconfig.ConfigReader.Result[AnimalConf] = Right(DogConf(4))
Readers for enumerations of objects can also be derived by using EnumConfigReader
instead:
import pureconfig.generic.derivation.EnumConfigReader
enum Season derives EnumConfigReader {
case Spring, Summer, Autumn, Winter
}
case class MyConf(list: List[Season]) derives ConfigReader
ConfigSource.string("{ list: [spring, summer, autumn, winter] }").load[MyConf]
// val res1: pureconfig.ConfigReader.Result[MyConf] = Right(MyConf(List(Spring, Summer, Autumn, Winter)))
Limitations
There is currently no way to customize case class and sealed trait derivation - any ProductHint
and CoproductHint
instances in scope are ignored.
ConfigWriter
derivation is not supported at the moment.
Overall, consider this to be in alpha/beta stage. This implementation is not as mature as the Shapeless or Magnolia-based derivation libraries available in Scala 2 yet so please report any bugs that you find!