Может ли 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
Я не хочу поддерживать два разных типа дел и думать о том, как конвертировать из одного в другой, я бы хотел иметь чистое решение для копирования и вставки scala class -> yaml config. Есть ли шанс, что я смогу добиться верблюжьего дела с обеих сторон?
Редактировать:
Я создал обертку вокруг библиотеки pureconfig, которая выполняет некоторые настройки, переопределяемые системными свойствами. Клиент должен использовать упаковщик следующим образом:
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 как "Неиспользуемый", и когда активируется "Оптимизировать импорт" или "Оптимизировать импорт на лету", импорт автоматически удаляется. Согласно этой теме (принятый ответ не работает для меня), мы можем решить эту проблему с помощью "Пометить импорт как всегда используемый...", однако это не идеальное решение, потому что другим членам команды придется делать то же самое для каждого проекта. или мы должны передать.idea в VCS (чего я хотел бы избежать).
Я прилагаю скриншот моего теста (зависимость pureconfig.generic.auto._
уже помечены как всегда используемые):
1 ответ
Да, ты можешь. Взгляните на документацию - сопоставления полей.
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
).