Skip to content

Commit 32b809d

Browse files
committed
get rid of try/catch
1 parent 1bc2149 commit 32b809d

File tree

2 files changed

+23
-20
lines changed

2 files changed

+23
-20
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package diffson.ujson
2+
3+
case class FieldMissing(fieldName: String)
4+
extends Exception(s"Expected field `$fieldName`, but it is missing")

ujson/shared/src/main/scala/diffson/ujson/package.scala

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import upickle.default._
2727
import scala.util.Try
2828

2929
package object ujson {
30-
30+
3131
implicit val jsonyUjson: Jsony[Value] = new Jsony[Value] {
3232

3333
def Null: Value = _root_.ujson.Null
@@ -113,37 +113,38 @@ package object ujson {
113113
implicit val operationEncoder: Writer[Operation[Value]] =
114114
implicitly[Writer[Value]].comap(operationAsJson)
115115

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-
123116
private def decodeOperation(value: Value): Operation[Value] = {
124117
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)
127123
}
128124

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+
}
130134

131135
op match {
132136
case "add" =>
133137
val path = readPointer(value)
134-
val v =
135-
try value.obj("value")
136-
catch throwFieldExpected("value")
138+
val v = getField("value")
137139
Add(path, v)
140+
138141
case "remove" =>
139142
val path = readPointer(value)
140143
val old = value.objOpt.flatMap(_.get("old"))
141144
Remove(path, old)
142145
case "replace" =>
143146
val path = readPointer(value)
144-
val payload =
145-
try value.obj("value")
146-
catch throwFieldExpected("value")
147+
val payload = getField("value")
147148
val old = value.objOpt.flatMap(_.get("old"))
148149
Replace(path, payload, old)
149150
case "move" =>
@@ -156,9 +157,7 @@ package object ujson {
156157
Copy(from, path)
157158
case "test" =>
158159
val path = readPointer(value)
159-
val payload =
160-
try value.obj("value")
161-
catch throwFieldExpected("value")
160+
val payload = getField("value")
162161
Test(path, payload)
163162
case other =>
164163
throw new Exception(s"Expected operation `$other` but it is missing")

0 commit comments

Comments
 (0)