通过PureConfig和Enumeratum实现包含Enum Map的Config类

问题描述 投票:0回答:2

我正在尝试使用 pureconfigpureconfig-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"
    }
}
scala config pureconfig enumeratum
2个回答
4
投票

您必须使用 可配置转换器 告诉 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(_))
  }

0
投票

只是建立在 @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"))
      }
    }
© www.soinside.com 2019 - 2024. All rights reserved.