Конфигурация Pureconfig Typesafe Config с запечатанным абстрактным классом case

Я пытаюсь включить Pureconfig в свой вариант использования для типизированных конфигураций. Было успешно сопоставлено HOCON .conf с типами классов case. Однако, если мне нужно ограничить свои типы без побочных эффектов на стороне определения объекта (т.е. подавить по умолчанию 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. Этот подход, кажется, работает, и мне нужно немного больше адресовать ключи конфигурации для сопоставления объектов и создания экземпляров.

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

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


person ganaakruti    schedule 10.01.2018    source источник


Ответы (1)


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

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

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

person Leif Wickland    schedule 11.01.2018
comment
отметив это как закрытое. Альтернативный подход (в соответствии с приведенной выше ссылкой на автоматический вывод ...) действительно сработал. Это отвечает моей потребности подавить по умолчанию apply () и copy (), помимо возможности автоматического магического сопоставления конфигурации с желаемым ADT. Для расширяемости также может быть абстрактный класс, расширяющий черту, чтобы иметь возможность обобщить требование сериализации (переопределить def toString ()). - person ganaakruti; 12.01.2018
comment
Кроме того, я решил использовать case class с методом copy (...), который соответствует единственному конструктору, который мне нужно было разрешить. Это решило проблему подавления методов apply () и copy () по умолчанию. В качестве уточнения я мог бы определить макрос, который можно применить к ADT, чтобы включить соответствующий метод копирования (...). Версия Scala, которую я пробовал - 2.12.3 - person ganaakruti; 12.01.2018