This repository has been archived by the owner on Dec 22, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Conversion.scala
101 lines (81 loc) · 4.98 KB
/
Conversion.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package controllers.conversion
import controllers.conversion.ImplicitConversions._
import org.scalarules.facts.Fact
import org.scalarules.finance.nl._
import play.api.data.validation.ValidationError
import play.api.libs.json._
import scala.reflect.runtime.universe._
trait JsonConversionsProvider {
def contextToJsonConversions: Map[Class[_], (Fact[Any], Any) => JsObject]
def jsonToFactConversions: Map[String, ConvertToFunc]
}
object DefaultJsonConversion extends JsonConversionsProvider {
override def contextToJsonConversions: Map[Class[_], ConvertBackFunc] = ContextToJsonConversionMap.contextToJsonConversionMap
override def jsonToFactConversions: Map[String, ConvertToFunc] = JsonToFactConversionMap.jsonToFactConversionMap
object ContextToJsonConversionMap {
val contextToJsonConversionMap: Map[Class[_], ConvertBackFunc] = Map[Class[_], ConvertBackFunc](
classOf[String] -> { contextStringToJsObject(_, _) },
classOf[Bedrag] -> { contextBedragToJsObject(_, _) },
classOf[Percentage] -> { contextPercentageToJsObject(_, _) },
classOf[BigDecimal] -> { contextBigDecimalToJsObject(_, _) },
classOf[Boolean] -> { contextBooleanToJsObject(_, _) },
classOf[java.lang.Boolean] -> { contextBooleanToJsObject(_, _) }
)
private def contextStringToJsObject(fact: Fact[Any], factValue: Any): JsObject = factValue match {
case string: String => JsObject(Map(fact.name -> Json.toJson(factValue.toString)))
case _ => throw new IllegalArgumentException
}
private def contextBedragToJsObject(fact: Fact[Any], factValue: Any): JsObject = factValue match {
case bedrag: Bedrag => JsObject(Map(fact.name -> Json.toJson[Bedrag](bedrag)))
case _ => throw new IllegalArgumentException
}
private def contextPercentageToJsObject(fact: Fact[Any], factValue: Any): JsObject = factValue match {
case percentage: Percentage => JsObject(Map(fact.name -> Json.toJson[Percentage](percentage)))
case _ => throw new IllegalArgumentException
}
private def contextBigDecimalToJsObject(fact: Fact[Any], factValue: Any): JsObject = factValue match {
case bigDecimal: BigDecimal => JsObject(Map(fact.name -> Json.toJson[BigDecimal](bigDecimal)))
case _ => throw new IllegalArgumentException
}
private def contextBooleanToJsObject(fact: Fact[Any], factValue: Any): JsObject = factValue match {
case bool: Boolean => JsObject(Map(fact.name -> JsBoolean(bool)))
case bool: java.lang.Boolean => JsObject(Map(fact.name -> JsBoolean(bool)))
case _ => throw new IllegalArgumentException
}
}
object JsonToFactConversionMap {
val jsonToFactConversionMap: Map[String, ConvertToFunc] = Map[String, ConvertToFunc](
classOf[String].getTypeName -> { stringFunct(_, _) },
weakTypeOf[String].toString -> { stringFunct(_, _) },
classOf[Bedrag].getTypeName -> { bedragFunct(_, _) },
classOf[Percentage].getTypeName -> { percentageFunct(_, _) },
classOf[BigDecimal].getTypeName -> { bigDecimalFunct(_, _) },
weakTypeOf[BigDecimal].toString -> { bigDecimalFunct(_, _) },
classOf[Boolean].getTypeName -> { booleanFunct(_, _) },
weakTypeOf[Boolean].toString -> { booleanFunct(_, _) }
)
private def stringFunct(fact: Fact[Any], factValue: JsValue): JsResult[String] = factValue match {
case jsString: JsString => JsSuccess(jsString.value)
case _ => JsError(ValidationError(s"Conversion for String fact ${fact.name} failed, corresponding value was not of expected type JsString"))
}
private def bigDecimalFunct(fact: Fact[Any], factValue: JsValue): JsResult[BigDecimal] = factValue match {
case jsNumber: JsNumber => JsSuccess(jsNumber.value)
case _ => JsError(ValidationError(s"Conversion for BigDecimal fact ${fact.name} failed, corresponding value was not of expected type JsNumber"))
}
private def bedragFunct(fact: Fact[Any], factValue: JsValue): JsResult[Bedrag] = factValue match {
case jsNumber: JsNumber => Json.fromJson[Bedrag](jsNumber)
case jsString: JsString => Json.fromJson[Bedrag](jsString)
case _ => JsError(ValidationError(s"Conversion for Bedrag fact ${fact.name} failed, corresponding value was not of expected type JsNumber"))
}
private def percentageFunct(fact: Fact[Any], factValue: JsValue): JsResult[Percentage] = factValue match {
case jsNumber: JsNumber => Json.fromJson[Percentage](jsNumber)
case jsString: JsString => Json.fromJson[Percentage](jsString)
case _ => JsError(ValidationError(s"Conversion for Percentage fact ${fact.name} failed, corresponding value was not of expected type JsNumber"))
}
private def booleanFunct(fact: Fact[Any], factValue: JsValue): JsResult[Boolean] = factValue match {
case jsBoolean: JsBoolean => JsSuccess(jsBoolean.value)
case jsString: JsString => JsSuccess(jsString.value.toBoolean)
case _ => JsError(ValidationError(s"Conversion for String fact ${fact.name} failed, corresponding value was not of expected type JsBoolean"))
}
}
}