-
-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathextensions.scala
88 lines (59 loc) · 2.39 KB
/
extensions.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
package scalalib
package json
import play.api.libs.json.*
import scalalib.newtypes.SameRuntime
object extensions:
extension (js: JsObject)
def str(key: String): Option[String] =
(js \ key).asOpt[String]
def int(key: String): Option[Int] =
(js \ key).asOpt[Int]
def long(key: String): Option[Long] =
(js \ key).asOpt[Long]
def boolean(key: String): Option[Boolean] =
(js \ key).asOpt[Boolean]
def obj(key: String): Option[JsObject] =
(js \ key).asOpt[JsObject]
def arr(key: String): Option[JsArray] =
(js \ key).asOpt[JsArray]
def arrAs[A](key: String)(as: JsValue => Option[A]): Option[List[A]] =
arr(key).map { j =>
j.value.iterator.map(as).to(List).flatten
}
def ints(key: String): Option[List[Int]] = arrAs(key)(_.asOpt[Int])
def strs(key: String): Option[List[String]] = arrAs(key)(_.asOpt[String])
def objs(key: String): Option[List[JsObject]] = arrAs(key)(_.asOpt[JsObject])
def get[A: Reads](key: String): Option[A] =
(js \ key).asOpt[A]
def noNull = JsObject:
js.fields.collect:
case (key, value) if value != JsNull => key -> value
def add(pair: (String, Boolean)): JsObject =
if pair._2 then js + (pair._1 -> JsBoolean(true))
else js
def add[A](pair: (String, A))(using sr: SameRuntime[A, Boolean]): JsObject = add(pair._1, sr(pair._2))
def add(key: String, value: Boolean): JsObject =
if value then js + (key -> JsBoolean(true))
else js
def add[A](key: String, value: A)(using sr: SameRuntime[A, Boolean]): JsObject = add(key, sr(value))
def add[A: Writes](pair: (String, Option[A])): JsObject =
pair._2.fold(js): a =>
js + (pair._1 -> Json.toJson(a))
def add[A: Writes](key: String, value: Option[A]): JsObject =
value.fold(js): a =>
js + (key -> Json.toJson(a))
extension (js: JsValue)
def str(key: String): Option[String] =
(js \ key).asOpt[String]
def int(key: String): Option[Int] =
(js \ key).asOpt[Int]
def long(key: String): Option[Long] =
(js \ key).asOpt[Long]
def boolean(key: String): Option[Boolean] =
(js \ key).asOpt[Boolean]
def obj(key: String): Option[JsObject] =
(js \ key).asOpt[JsObject]
def get[A: Reads](key: String): Option[A] =
(js \ key).asOpt[A]
def arr(key: String): Option[JsArray] =
(js \ key).asOpt[JsArray]