Skip to content

Commit f8722da

Browse files
committed
Fix decoding error on extra members for nullary case classes and objects with MapBasedCodecs, closes #600
1 parent 60c6f10 commit f8722da

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

derivation/src/main/scala/io/bullet/borer/derivation/MapBasedCodecs.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,12 @@ object MapBasedCodecs extends DerivationApi {
246246
new Deriver[Decoder, T, quotes.type]:
247247

248248
def deriveForCaseObject(moduleTermSymbol: Symbol): Expr[Decoder[T]] =
249-
'{ Decoder[T](r => r.readMapClose(r.readMapOpen(0), ${ Ref(moduleTermSymbol).asExprOf[T] })) }
249+
'{
250+
Decoder[T] { r =>
251+
if (r.readMapOpen(0)) while (!r.tryReadBreak()) r.skipElement()
252+
${ Ref(moduleTermSymbol).asExprOf[T] }
253+
}
254+
}
250255

251256
def deriveForCaseClass(
252257
tpe: TypeRepr,
@@ -443,7 +448,7 @@ object MapBasedCodecs extends DerivationApi {
443448
else fail("Case classes mit > 128 fields are not supported")
444449
} else
445450
'{
446-
if (count < 0) $r.readBreak()
451+
if (count < 0) while (! $r.tryReadBreak()) $r.skipElement()
447452
${ companionApply(companion, typeArgs(tpe), Nil).asExprOf[T] }
448453
}
449454
}

derivation/src/test/scala/io/bullet/borer/derivation/MiscSpec.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,17 @@ class MiscSpec extends AbstractBorerSpec {
162162
| 1| }
163163
|""".stripMargin
164164
}
165+
166+
test("Extra members") {
167+
sealed trait Base
168+
case class A(x: Int) extends Base
169+
case class B() extends Base
170+
case object C extends Base
171+
172+
implicit val baseCodecs: Decoder[Base] = MapBasedCodecs.deriveAllDecoders
173+
174+
verifyDecoding[Base]("""{"A":{"x":100, "extra": "should be ignored"}}""", A(100))
175+
verifyDecoding[Base]("""{"B":{"extra": "should be ignored"}}""", B())
176+
verifyDecoding[Base]("""{"C":{"extra": "should be ignored"}}""", C)
177+
}
165178
}

0 commit comments

Comments
 (0)