pureconfig可以使用骆驼的情况下配置

时间:2019-05-31 15:45:08

标签: scala pureconfig

我正在将pureconfig pureconfig lib与pureconfig-yaml模块一起使用。一切都像一个咒语,我唯一的问题是我必须将属性名称从驼峰大小写转换为烤肉串大小写。

来自现实世界的痛苦示例:

case class Config(log4JPath: String, registryURL: String, HOUR_FORMAT: String)

Yaml:
log-4-j-path: /conf/log4j.properties
registry-url: http://foo.com
hour-_-format: dd-mm-yy

我不想维护2种不同的大小写类型,并考虑如何从一种转换为另一种,我很想拥有一个纯复制并粘贴scala类-> yaml config解决方案。我有机会在两边都达成骆驼案吗?

编辑:

我围绕pureconfig lib创建了一个包装器,该包装器对系统属性进行了一些配置覆盖。客户应通过以下方式使用包装器:

val conf: Config = ConfigLoader(file).load[Config]

但这还不够,客户需要提供2个导入:

// to find implicit reader
import pureconfig.generic.auto._
// to use Camelcase - as suggested from the answer
import ConfigLoader.productHint

如果包装器(ConfigLoader)可以处理进口货物,而这些货物不由客户负责,那将是很好的。 此外,IntelliJ IDE将导入标识为“未使用”,并且在触发“优化导入”或启用“即时优化导入”时,导入将被自动擦除。根据{{​​3}}主题(接受的答案对我不起作用),我们可以使用“标记导入为一直使用...”来解决此问题,但这不是理想的解决方案,因为其他团队成员将不得不对于每个项目都一样,否则我们应该将.idea提交给VCS(我想避免)。

我正在附上我的测试屏幕截图(相关性pureconfig.generic.auto._已被标记为始终使用): this

1 个答案:

答案 0 :(得分:2)

可以。看看documentation - field-mappings

import pureconfig._
import pureconfig.generic.auto._
import pureconfig.generic.ProductHint

// Case classes should be final ;)
final case class Config(log4JPath: String, registryURL: String, HOUR_FORMAT: String)

val yaml =
  """log4JPath: /conf/log4j.properties
    |registryURL: http://foo.com
    |HOUR_FORMAT: dd-mm-yy""".stripMargin

implicit val indentityHint: ProductHint[Conf] =
  ProductHint[Conf](new ConfigFieldMapping {
    def apply(fieldName: String) = fieldName // Basically the identity.
  }) 

loadYaml[Config](yaml)
// res: ConfigReader.Result[Config] = Right(Config("/conf/log4j.properties", "http://foo.com", "dd-mm-yy"))

(请注意,这是使用ammonite使用pureconfig 0.11.0测试的)