我正在尝试使用 pureconfig 和 pureconfig-enumeratum 库版本 0.14.0 和 scala 2.11 将我的配置文件读入我的案例类,其属性之一是枚举键和案例类值的映射。 当我将 Map 键从 Enumeratum 键更改为 String 时,它可以工作,但它不适用于 Enum 键。
import enumeratum.EnumEntry.{Hyphencase}
import enumeratum._
import pureconfig.{ConfigSource}
import pureconfig.generic.auto._
import pureconfig.module.enumeratum._
object CheckPureConfig extends App {
private val myConf = ConfigSource.default.loadOrThrow[SsystemConf]
println(myConf)
}
case class SsystemConf(target: Map[Ssystem, MyConfig])
case class MyConfig(path: Ssystem, link: String)
sealed abstract class Ssystem(myField: String) extends EnumEntry with Hyphencase{
def printit() = myField
}
object Ssystem extends Enum[Ssystem] {
val values = findValues
case object MyEnumA extends Ssystem("testFieldEnum1")
case object MyEnumB extends Ssystem("testFieldEnum2")
}
这是我的application.conf
target {
my-enum-a= {
path : "samplepath1"
link : "samplehttp1"
}
my-enum-b = {
path : "samplepath2"
link : "samplehttp2"
}
}
您必须使用 可配置转换器 告诉 pureconfig 如何将枚举转换为映射键。你有
genericMapReader
:
implicit def enumMapReader[V: ConfigReader]: ConfigReader[Map[Ssystem, V]] =
genericMapReader { name =>
Ssystem.withNameOption(name)
.fold[Either[String, Ssystem]](Left(s"$name is not enum"))(Right(_))
}
只是建立在 @mateusz-kubuszok 答案的基础上,这对我的 0.17.6 版本有用。
这里我的地图键枚举类称为
TriggerSource
implicit def enumMapReader[V: ConfigReader]: ConfigReader[Map[TriggerSource, V]] =
genericMapReader[TriggerSource, V] { name =>
TriggerSource.withNameOption(name) match {
case Some(value) => Right(value)
case None => Left(CannotConvert(name, "TriggerSource", s"$name is not enum"))
}
}