Может ли 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).

Другие вопросы по тегам