pureconfig可以使用驼峰配置吗
Can pureconfig use camel case config
我正在使用 pureconfig pureconfig lib with 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 class -> yaml 配置解决方案。我有机会在两边都实现骆驼案例吗?
编辑:
我已经围绕 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 将导入标识为 "Unused",当触发 "optimize imports" 或启用 "Optimize imports on the fly" 时,导入将被自动删除。根据 线程(接受的答案对我不起作用),我们可以用 "Mark import as always used..." 解决这个问题,但这不是一个理想的解决方案,因为其他团队成员必须对每个项目或我们应该将 .idea 提交给 VCS(我想避免)。
我附上了我的测试截图(依赖项 pureconfig.generic.auto._
已经被标记为一直使用):
是的,你可以。看看 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"))
(注意,这是在菊石中测试的,使用 pureconfig 0.11.0
)。
我正在使用 pureconfig pureconfig lib with 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 class -> yaml 配置解决方案。我有机会在两边都实现骆驼案例吗?
编辑:
我已经围绕 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 将导入标识为 "Unused",当触发 "optimize imports" 或启用 "Optimize imports on the fly" 时,导入将被自动删除。根据
我附上了我的测试截图(依赖项 pureconfig.generic.auto._
已经被标记为一直使用):
是的,你可以。看看 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"))
(注意,这是在菊石中测试的,使用 pureconfig 0.11.0
)。