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
для тебя.