2017-11-29 20 views
1

これはScalaのpureconfigの本質に反していると知っています... このケースクラスのためにscala pureconfig構成の読み込みを実装することは可能ですか?任意の型または少なくともString、Integer、Double、Array [Strings]、Array [Integer]、Array [Double]のいずれかを持つ、厳密に型指定された値(Stringとして)を持つこと。あなたはそのフィールドANY作ることができます私の理解不足にコンフィギュレーション中にvalal scala pureconfigを割り当ててください

case class Filter(
    field: String, 
    operator: String, 
    variable: String // should support Int , Double , List[String], List[Int] 
) 

、CoProductHintもカスタムリーダーのアプローチのどちらも動作します...

答えて

4

デフォルトpureconfigことでありませんAnyを読む方法を提供する。特定のクラスのためにあなたがAnyを読みたいなら、あなたはそのクラスのコンテキストでAnyのためのコーデックを定義することができます。

case class Filter(field: String, operator: String, variable: Any) 

implicit val readFilter = { 
    implicit val readAny = new ConfigReader[Any] { 
    def from(config: ConfigValue): Either[ConfigReaderFailures, Any] = { 
     Right(config.unwrapped()) 
    } 
    } 
    ConfigReader[Filter] 
} 

をし、その後、あなたはFilter

val config = ConfigFactory.parseString(
    """ 
    { 
     field: "foo" 
     operator: "bar" 
     variable: [] 
    } 
    """) 
println(pureconfig.loadConfig[Filter](config)) 
// will print Right(Filter(foo,bar,[])) 

unwrappedConfigValueを変換し、読むことができます再帰的にAnyになります。

答えはyesです。可能であれば、pureconfigにAnyの読み方を教えてください。

Anyのコーデックをpureconfigで提供しない理由は、AnyがScalaのすべてのクラスの祖先であり、何かのコーデック(データベース接続など)を作成できないためです。

sealed abstract class MySupportedType 
final case class MyInt(value: Int) extends MySupportedType 
final case class MyDouble(value: Double) extends MySupportedType 
final case class MyListOfString(value: List[String]) extends MySupportedType 
final case class MyListOfInt(value: List[Int]) extends MySupportedType 

final case class Filter2(field: String, operator: String, variable: MySupportedType) 

をして、直和値またはカスタムコーデックを抽出するために、デフォルトの方法を使用する:あなたはタイプの制限されたセットを期待していることを知ったとき、あなたが記載されているもののように、あなたは、副生成物のすべてをラップすることができます副生成物の代わりに、Anyを使用してMySupportedType

val config = ConfigFactory.parseString(
    """ 
    { 
     field: "foo" 
     operator: "bar" 
     variable: { 
     type: mylistofint 
     value: [] 
     } 
    } 
    """) 
    println(pureconfig.loadConfig[Filter2](config)) 
    // will print Right(Filter2(foo,bar,MyListOfInt(List()))) 

は何かが、あなたがやっていることに問題がある場合variableは、コンパイラの助けあなたを持って聞かせできる値を制限します。

+0

ありがとうございます!優れた深遠な答え!賞品を受け取るのを待っています... –

+0

@YordanGeorgiev、私は、ボーナスを明示的に指定しない限り、あなたがすでに正しい答えを選択した後でボーナスを開始したため、自動的に割り当てられない可能性があります。 – SergGr

+0

Tnx!私も疑問を抱いていた... –

0

: 例:

scala> case class Filter(
    | field: String, 
    | operator: String, 
    | variable: Any // should support Int , Double , List[String], List[Int] 
    | ) 
defined class Filter 

scala> Filter("anurag","data",List(12,34)) 
res5: Filter = Filter(anurag,data,List(12, 34)) 

scala> Filter("anurag","data",List(12.12,34.12)) 
res6: Filter = Filter(anurag,data,List(12.12, 34.12)) 

scala> Filter("anurag","data",List("Hello","Hii")) 
res8: Filter = Filter(anurag,data,List(Hello, Hii)) 
+0

これは、コンパイル時にpureconfigパーサーを通過しないことを試みました。 –

関連する問題