Domanda

Sono un principiante alla Scala e questo codice mi fa lottare.

Esiste un modo per eseguire la corrispondenza dei modelli per assicurarsi che tutto ciò che passo ai dati sia del tipo corretto? Come puoi vedere, ho dei tipi di dati piuttosto strani ...

class Data (
val recipient: String, 
val templateText: String, 
val templateHtml: String, 
val blockMaps: Map[String,List[Map[String,String]]], 
templateMap: Map[String,String]
)

...

val dataParsed = JSON.parseFull(message)
dataParsed match {
 case dataParsed: Map[String, Any] => {
  def e(s: String) = dataParsed get s
  val templateText = e("template-text")
  val templateHtml = e("template-html")
  val recipient = e("email")
  val templateMap = e("data")
  val blockMaps = e("blkdata")

  val dependencies = new Data(recipient, templateText, templateHtml, blockMaps, templateMap)
  Core.inject ! dependencies
 }

...

È stato utile?

Soluzione

Suppongo che il tuo problema sia che vuoi essere in grado di abbinare la mappa che ottieni da parseFull () , ma Map non ha un unpply .

Quindi puoi modellare ogni singolo valore, fornendo un valore predefinito se non è del tipo corretto:

val templateText: Option[String] = e("template-text") match {
  case s: String => Some(s)
  case _ => None
}

O metti temporaneamente tutti i dati in una struttura che può essere abbinata al modello:

val data = (e("template-text"), e("template-html"), e("email"), e("data"),
            e("blkdata"))

val dependencies: Option[Data] = data match {
  case (templateText: String,
        templateHtml: String,
        blockMaps: Map[String,List[Map[String,String]]],
        templateMap: Map[String,String]) =>
    Some(new Data(recipient, templateText, templateHtml, blockMaps, templateMap))
  case _ => None
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top