@@ -27,7 +27,7 @@ import upickle.default._
27
27
import scala .util .Try
28
28
29
29
package object ujson {
30
-
30
+
31
31
implicit val jsonyUjson : Jsony [Value ] = new Jsony [Value ] {
32
32
33
33
def Null : Value = _root_.ujson.Null
@@ -113,37 +113,38 @@ package object ujson {
113
113
implicit val operationEncoder : Writer [Operation [Value ]] =
114
114
implicitly[Writer [Value ]].comap(operationAsJson)
115
115
116
- def throwFieldExpected (
117
- fieldName : String
118
- ): PartialFunction [Throwable , Nothing ] = {
119
- case t : Throwable =>
120
- throw new Exception (s " Expected field ` $fieldName`, but it is missing " , t)
121
- }
122
-
123
116
private def decodeOperation (value : Value ): Operation [Value ] = {
124
117
def readPointer (value : Value , path : String = " path" ): Pointer = {
125
- val p = try { value.obj(path) } catch throwFieldExpected(path)
126
- read[Pointer ](p)
118
+ val serializedPointer =
119
+ value.objOpt.flatMap(_.get(path))
120
+ .getOrElse(throw FieldMissing (path))
121
+
122
+ read[Pointer ](serializedPointer)
127
123
}
128
124
129
- val op = try value.obj(" op" ).str catch throwFieldExpected(" op" )
125
+ val op =
126
+ value
127
+ .objOpt.flatMap(_.get(" op" ).flatMap(_.strOpt))
128
+ .getOrElse(throw FieldMissing (" op" ))
129
+
130
+ def getField (key : String ) = {
131
+ value.objOpt.flatMap(_.get(key))
132
+ .getOrElse(throw FieldMissing (key))
133
+ }
130
134
131
135
op match {
132
136
case " add" =>
133
137
val path = readPointer(value)
134
- val v =
135
- try value.obj(" value" )
136
- catch throwFieldExpected(" value" )
138
+ val v = getField(" value" )
137
139
Add (path, v)
140
+
138
141
case " remove" =>
139
142
val path = readPointer(value)
140
143
val old = value.objOpt.flatMap(_.get(" old" ))
141
144
Remove (path, old)
142
145
case " replace" =>
143
146
val path = readPointer(value)
144
- val payload =
145
- try value.obj(" value" )
146
- catch throwFieldExpected(" value" )
147
+ val payload = getField(" value" )
147
148
val old = value.objOpt.flatMap(_.get(" old" ))
148
149
Replace (path, payload, old)
149
150
case " move" =>
@@ -156,9 +157,7 @@ package object ujson {
156
157
Copy (from, path)
157
158
case " test" =>
158
159
val path = readPointer(value)
159
- val payload =
160
- try value.obj(" value" )
161
- catch throwFieldExpected(" value" )
160
+ val payload = getField(" value" )
162
161
Test (path, payload)
163
162
case other =>
164
163
throw new Exception (s " Expected operation ` $other` but it is missing " )
0 commit comments