forked from fehmicansaglam/reactivemongo-extensions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJsonDsl.scala
128 lines (96 loc) · 3.34 KB
/
JsonDsl.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright (C) 2014 the original author or authors.
// See the LICENCE.txt file distributed with this work for additional
// information regarding copyright ownership.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package reactivemongo.extensions.dsl
import play.api.libs.json._
import play.api.libs.json.Json.{ JsValueWrapper, toJsFieldJsValueWrapper }
import reactivemongo.bson.BSONObjectID
import play.modules.reactivemongo.json.BSONFormats._
trait JsonDsl {
type Field = String
type Value = JsValueWrapper
type Element = (Field, Value)
def $empty: JsObject = Json.obj()
def $doc(element: Element, elements: Element*): JsObject = {
Json.obj((Seq(element) ++ elements): _*)
}
def $and(element: Element, elements: Element*): JsObject = {
$doc(element, elements: _*)
}
def $docx(field: Field, element: Element, elements: Element*): JsObject = {
Json.obj(field -> Json.obj((Seq(element) ++ elements): _*))
}
def $id(id: Value): JsObject = {
$doc("_id" -> id)
}
def $exists(field: Field, exists: Boolean = true): JsObject = {
$doc(field -> $doc("$exists" -> exists))
}
def $ne(element: Element): JsObject = {
Json.obj(element._1 -> Json.obj("$ne" -> element._2))
}
def $gt(element: Element): JsObject = {
Json.obj(element._1 -> Json.obj("$gt" -> element._2))
}
def $gtx(value: Value): Element = {
"$gt" -> value
}
def $gte(element: Element): JsObject = {
Json.obj(element._1 -> Json.obj("$gte" -> element._2))
}
def $gtex(value: Value): Element = {
"$gte" -> value
}
def $in(field: String, value: Value): JsObject = {
Json.obj(field -> Json.obj("$in" -> value))
}
def $lt(element: Element): JsObject = {
Json.obj(element._1 -> Json.obj("$lt" -> element._2))
}
def $ltx(value: Value): Element = {
"$lt" -> value
}
def $lte(element: Element): JsObject = {
Json.obj(element._1 -> Json.obj("$lte" -> element._2))
}
def $ltex(value: Value): Element = {
"$lte" -> value
}
def $nin(field: String, value: Value): JsObject = {
Json.obj(field -> Json.obj("$nin" -> value))
}
def $set(element: Element, elements: Element*): JsObject = {
Json.obj("$set" -> Json.obj((Seq(element) ++ elements): _*))
}
def $unset(field: String, fields: String*): JsObject = {
Json.obj("$unset" -> Json.obj((Seq(field) ++ fields).map(_ -> toJsFieldJsValueWrapper("")): _*))
}
def $push(element: Element): JsObject = {
Json.obj("$push" -> Json.obj(element))
}
def $pushEach(field: String, values: Value*): JsObject = {
Json.obj(
"$push" -> Json.obj(
field -> Json.obj(
"$each" -> Json.arr(values: _*))))
}
def $pull(element: Element): JsObject = {
Json.obj("$pull" -> Json.obj(element))
}
def $or(expressions: JsObject*): JsObject = {
Json.obj("$or" -> expressions)
}
}
object JsonDsl extends JsonDsl