From 5803c1ffc853f549ad69af27a30a1d0ef54a9a4f Mon Sep 17 00:00:00 2001 From: Nathan Date: Tue, 31 Jan 2017 17:15:27 +0100 Subject: [PATCH] Added conversion support for internal contexts to Json, i.e. when your result context contains another fact to context, such as with an ElementBerekening. --- app/controllers/conversion/Conversion.scala | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/controllers/conversion/Conversion.scala b/app/controllers/conversion/Conversion.scala index 5ca7a35..843c693 100644 --- a/app/controllers/conversion/Conversion.scala +++ b/app/controllers/conversion/Conversion.scala @@ -6,14 +6,21 @@ import org.scalarules.finance.nl._ import play.api.data.validation.ValidationError import play.api.libs.json.{JsObject, _} +import scala.reflect.{ClassTag, classTag} import scala.reflect.runtime.universe._ trait JsonConversionsProvider { private def convertFacts(fact: Fact[Any], factValue: Any): JsObject = JsObject(Map(fact.name -> turnFactsIntoJson(factValue))) + private def matchMap[A : ClassTag, B: ClassTag](map: Map[A, B]) = map match { + case context: Map[Fact[Any] @unchecked, Any @unchecked] if classTag[A] == classTag[Fact[Any]] => + context.map{ case (key, value) => convertFacts(key.asInstanceOf[Fact[Any]], value)}.reduceLeft(_ ++ _) + } + private def turnFactsIntoJson(factValue: Any): JsValue = //scalastyle:ignore cyclomatic.complexity try { userSpecifiedConversionsToJson(factValue) } catch { case e: Exception => factValue match { + case map: Map[Any @unchecked, Any @unchecked] => matchMap(map) case x :: xs => JsArray(for { elem <- (x :: xs)} yield turnFactsIntoJson(elem)) case bedrag: Bedrag => Json.toJson(bedrag) case string: String => Json.toJson(string)