Может ли pureconfig использовать конфигурацию верблюда - PullRequest
1 голос
/ 31 мая 2019

Я использую 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 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._ уже помечена как всегда используемая): enter image description here

1 Ответ

3 голосов
/ 31 мая 2019

Да, вы можете. Ознакомьтесь с документацией - сопоставления полей .

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) .

...