@@ -2,7 +2,7 @@ package zio.json
2
2
3
3
import magnolia1 ._
4
4
import zio .Chunk
5
- import zio .json .JsonDecoder .{ JsonError , UnsafeJson }
5
+ import zio .json .JsonDecoder .JsonError
6
6
import zio .json .ast .Json
7
7
import zio .json .internal .{ Lexer , RetractReader , StringMatrix , Write }
8
8
@@ -228,21 +228,24 @@ object DeriveJsonDecoder {
228
228
json match {
229
229
case Json .Obj (_) => ctx.rawConstruct(Nil )
230
230
case Json .Null => ctx.rawConstruct(Nil )
231
- case _ => throw UnsafeJson ( JsonError . Message (" Not an object" ) :: trace)
231
+ case _ => Lexer .error (" Not an object" , trace)
232
232
}
233
233
}
234
234
else
235
235
new JsonDecoder [A ] {
236
236
val (names, aliases): (Array [String ], Array [(String , Int )]) = {
237
- val names = Array .ofDim [String ](ctx.parameters.size)
237
+ val names = new Array [String ](ctx.parameters.size)
238
238
val aliasesBuilder = Array .newBuilder[(String , Int )]
239
- ctx.parameters.zipWithIndex.foreach { case (p, i) =>
240
- names(i) = p.annotations.collectFirst { case jsonField(name) => name }
241
- .getOrElse(if (transformNames) nameTransform(p.label) else p.label)
242
- aliasesBuilder ++= p.annotations.flatMap {
243
- case jsonAliases(alias, aliases @ _* ) => (alias +: aliases).map(_ -> i)
244
- case _ => Seq .empty
245
- }
239
+ ctx.parameters.foreach {
240
+ var i = 0
241
+ p =>
242
+ names(i) = p.annotations.collectFirst { case jsonField(name) => name }
243
+ .getOrElse(if (transformNames) nameTransform(p.label) else p.label)
244
+ aliasesBuilder ++= p.annotations.flatMap {
245
+ case jsonAliases(alias, aliases @ _* ) => (alias +: aliases).map(_ -> i)
246
+ case _ => Seq .empty
247
+ }
248
+ i += 1
246
249
}
247
250
val aliases = aliasesBuilder.result()
248
251
@@ -270,9 +273,6 @@ object DeriveJsonDecoder {
270
273
lazy val namesMap : Map [String , Int ] =
271
274
(names.zipWithIndex ++ aliases).toMap
272
275
273
- private [this ] def error (message : String , trace : List [JsonError ]): Nothing =
274
- throw UnsafeJson (JsonError .Message (message) :: trace)
275
-
276
276
def unsafeDecode (trace : List [JsonError ], in : RetractReader ): A = {
277
277
Lexer .char(trace, in, '{' )
278
278
@@ -288,7 +288,7 @@ object DeriveJsonDecoder {
288
288
do {
289
289
val field = Lexer .field(trace, in, matrix)
290
290
if (field != - 1 ) {
291
- if (ps(field) != null ) error(" duplicate" , trace)
291
+ if (ps(field) != null ) Lexer . error(" duplicate" , trace)
292
292
val default = defaults(field)
293
293
ps(field) =
294
294
if (
@@ -298,8 +298,8 @@ object DeriveJsonDecoder {
298
298
}
299
299
) tcs(field).unsafeDecode(spans(field) :: trace, in)
300
300
else if (in.readChar() == 'u' && in.readChar() == 'l' && in.readChar() == 'l' ) default.get
301
- else error(" expected 'null'" , spans(field) :: trace)
302
- } else if (no_extra) error(" invalid extra field" , trace)
301
+ else Lexer . error(" expected 'null'" , spans(field) :: trace)
302
+ } else if (no_extra) Lexer . error(" invalid extra field" , trace)
303
303
else Lexer .skipValue(trace, in)
304
304
} while (Lexer .nextField(trace, in))
305
305
var i = 0
@@ -322,13 +322,13 @@ object DeriveJsonDecoder {
322
322
for ((key, value) <- fields) {
323
323
namesMap.get(key) match {
324
324
case Some (field) =>
325
- if (ps(field) != null ) error(" duplicate" , trace)
325
+ if (ps(field) != null ) Lexer . error(" duplicate" , trace)
326
326
ps(field) = {
327
327
if ((value eq Json .Null ) && (defaults(field) ne None )) defaults(field).get
328
328
else tcs(field).unsafeFromJsonAST(spans(field) :: trace, value)
329
329
}
330
330
case _ =>
331
- if (no_extra) error(" invalid extra field" , trace)
331
+ if (no_extra) Lexer . error(" invalid extra field" , trace)
332
332
}
333
333
}
334
334
var i = 0
@@ -341,7 +341,7 @@ object DeriveJsonDecoder {
341
341
i += 1
342
342
}
343
343
ctx.rawConstruct(new ArraySeq (ps))
344
- case _ => error(" Not an object" , trace)
344
+ case _ => Lexer . error(" Not an object" , trace)
345
345
}
346
346
}
347
347
}
@@ -374,14 +374,8 @@ object DeriveJsonDecoder {
374
374
val a = tcs(field).unsafeDecode(trace_, in).asInstanceOf [A ]
375
375
Lexer .char(trace, in, '}' )
376
376
a
377
- } else
378
- throw UnsafeJson (
379
- JsonError .Message (" invalid disambiguator" ) :: trace
380
- )
381
- } else
382
- throw UnsafeJson (
383
- JsonError .Message (" expected non-empty object" ) :: trace
384
- )
377
+ } else Lexer .error(" invalid disambiguator" , trace)
378
+ } else Lexer .error(" expected non-empty object" , trace)
385
379
}
386
380
387
381
override final def unsafeFromJsonAST (trace : List [JsonError ], json : Json ): A =
@@ -391,10 +385,10 @@ object DeriveJsonDecoder {
391
385
namesMap.get(key) match {
392
386
case Some (idx) =>
393
387
tcs(idx).unsafeFromJsonAST(JsonError .ObjectAccess (key) :: trace, inner).asInstanceOf [A ]
394
- case None => throw UnsafeJson ( JsonError . Message (" Invalid disambiguator" ) :: trace)
388
+ case None => Lexer .error (" Invalid disambiguator" , trace)
395
389
}
396
- case Json .Obj (_) => throw UnsafeJson ( JsonError . Message (" Not an object with a single field" ) :: trace)
397
- case _ => throw UnsafeJson ( JsonError . Message (" Not an object" ) :: trace)
390
+ case Json .Obj (_) => Lexer .error (" Not an object with a single field" , trace)
391
+ case _ => Lexer .error (" Not an object" , trace)
398
392
}
399
393
}
400
394
else
@@ -410,20 +404,14 @@ object DeriveJsonDecoder {
410
404
do {
411
405
if (Lexer .field(trace, in_, hintmatrix) != - 1 ) {
412
406
val field = Lexer .enumeration(trace, in_, matrix)
413
- if (field == - 1 )
414
- throw UnsafeJson (
415
- JsonError .Message (s " invalid disambiguator " ) :: trace
416
- )
407
+ if (field == - 1 ) Lexer .error(" invalid disambiguator" , trace)
417
408
in_.rewind()
418
409
val trace_ = spans(field) :: trace
419
410
return tcs(field).unsafeDecode(trace_, in_).asInstanceOf [A ]
420
411
} else
421
412
Lexer .skipValue(trace, in_)
422
413
} while (Lexer .nextField(trace, in_))
423
-
424
- throw UnsafeJson (
425
- JsonError .Message (s " missing hint ' $hintfield' " ) :: trace
426
- )
414
+ Lexer .error(s " missing hint ' $hintfield' " , trace)
427
415
}
428
416
429
417
override final def unsafeFromJsonAST (trace : List [JsonError ], json : Json ): A =
@@ -433,14 +421,12 @@ object DeriveJsonDecoder {
433
421
case Some ((_, Json .Str (name))) =>
434
422
namesMap.get(name) match {
435
423
case Some (idx) => tcs(idx).unsafeFromJsonAST(trace, json).asInstanceOf [A ]
436
- case None => throw UnsafeJson ( JsonError . Message (" Invalid disambiguator" ) :: trace)
424
+ case _ => Lexer .error (" Invalid disambiguator" , trace)
437
425
}
438
- case Some (_) =>
439
- throw UnsafeJson (JsonError .Message (s " Non-string hint ' $hintfield' " ) :: trace)
440
- case None =>
441
- throw UnsafeJson (JsonError .Message (s " Missing hint ' $hintfield' " ) :: trace)
426
+ case Some (_) => Lexer .error(s " Non-string hint ' $hintfield' " , trace)
427
+ case _ => Lexer .error(s " Missing hint ' $hintfield' " , trace)
442
428
}
443
- case _ => throw UnsafeJson ( JsonError . Message (" Not an object" ) :: trace)
429
+ case _ => Lexer .error (" Not an object" , trace)
444
430
}
445
431
}
446
432
}
0 commit comments