Pureconfig Typesafe Config с классом закрытых абстрактных кейсов

Я пытаюсь включить Pureconfig в свой вариант использования для безопасных типов конфигураций. Успешно сопоставил HOCON .conf с типами классов дел. Однако, если мне нужно ограничить свои типы без побочных эффектов на стороне определения объекта (т. Е. Supress default apply() и copy()), я использую следующий подход определения для case-класса:

sealed abstract case class someConfig(name:String)

object someConfig{
    def apply(name:String):Option[someConfig]={
        if(Option(name).isDefined && name.nonEmpty){
            Some(new someConfig(name){})
        } else {
            None
        }
    }
}

Для поддержки типов Option[_] я рассматриваю возможность использования неявного ConfigReader. Этот подход, кажется, работает, с немного большим для меня адресом config-ключей для сопоставления и создания объектов.

Примеры, которые я искал до сих пор, похоже, не резонируют с этой потребностью. Тем не менее, обратите внимание на использование Option[_] для членов объекта. Попробовал пройтись по примерам кода в git repo Pureconfig.

Может ли кто-нибудь предложить подход, в котором может поддерживаться Option[T], где T - составной пользовательский тип? И мне не нужно иметь дело с именем переменной члена для сопоставления ключей конфигурации и т. Д., Т. Е. Избегать необходимого шаблона!

1 ответ

Решение

Потому что вы спрятали конструктор для своего класса, чтобы направить валидацию через apply, вам придется вручную построить ConfigReader, Я полагаю, что это так же просто, как поместить это в ваш объект-компаньон:

implicit val configReader = 
  pureconfig.ConfigReader.fromNonEmptyStringOpt[someConfig](apply)

В качестве альтернативы, вы можете назвать класс, реализующий ваш абстрактный тип, и в этом случае автоматический вывод PureConfig для запечатанных семейств волшебным образом создаст ConfigReader для тебя.

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