Skip to content

Commit

Permalink
.
Browse files Browse the repository at this point in the history
  • Loading branch information
lihaoyi committed Jul 11, 2024
1 parent 38ac056 commit 1082187
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 0 deletions.
12 changes: 12 additions & 0 deletions upickle/core/src/upickle/core/Types.scala
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ trait Types{ types =>
extends Visitor.Delegate[Any, T](other) with ReadWriter[T]

def merge[T](tagKey: String, rws: ReadWriter[_ <: T]*): TaggedReadWriter[T] = {
assert(
rws.forall(_.isInstanceOf[TaggedReadWriter[_]]),
"Can only merge ReadWriters of case classes, not " + rws.filterNot(_.isInstanceOf[TaggedReadWriter[_]])
)
new TaggedReadWriter.Node(tagKey, rws.asInstanceOf[Seq[TaggedReadWriter[T]]]:_*)
}

Expand Down Expand Up @@ -108,6 +112,10 @@ trait Types{ types =>
override def visitArray(length: Int, index: Int) = super.visitArray(length, index).asInstanceOf[ArrVisitor[Any, Z]]
}
def merge[T](tagKey: String, readers0: Reader[_ <: T]*): TaggedReader.Node[T] = {
assert(
readers0.forall(_.isInstanceOf[TaggedReader[_]]),
"Can only merge Readers of case classes, not " + readers0.filterNot(_.isInstanceOf[TaggedReader[_]])
)
new TaggedReader.Node(tagKey, readers0.asInstanceOf[Seq[TaggedReader[T]]]:_*)
}

Expand Down Expand Up @@ -147,6 +155,10 @@ trait Types{ types =>
def write0[R](out: Visitor[_, R], v: U): R = src.write(out, f(v))
}
def merge[T](writers: Writer[_ <: T]*) = {
assert(
writers.forall(_.isInstanceOf[TaggedWriter[_]]),
"Can only merge Writers of case classes, not " + writers.filterNot(_.isInstanceOf[TaggedWriter[_]])
)
new TaggedWriter.Node(writers.asInstanceOf[Seq[TaggedWriter[T]]]:_*)
}
}
Expand Down
30 changes: 30 additions & 0 deletions upickle/test/src/upickle/FailureTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,26 @@ object WrongTag {

}

object TaggedCustomSerializer{

sealed trait BooleanOrInt

object BooleanOrInt {
implicit val rw: upickle.default.ReadWriter[BooleanOrInt] = upickle.default.macroRW
}

case class IsBoolean(val value: Boolean) extends BooleanOrInt

object IsBoolean {
implicit val rw: upickle.default.ReadWriter[IsBoolean] = upickle.default.readwriter[Boolean].bimap[IsBoolean](_.value, IsBoolean(_))
}

case class IsInt(val value: Int) extends BooleanOrInt

object IsInt {
implicit val rw: upickle.default.ReadWriter[IsInt] = upickle.default.readwriter[Int].bimap[IsInt](_.value, IsInt(_))
}
}
/**
* Generally, every failure should be a Invalid.Json or a
* InvalidData. If any assertion errors, match errors, number
Expand Down Expand Up @@ -273,5 +293,15 @@ object FailureTests extends TestSuite {
// upickle.default.read[Int]("10e-1") ==> 1
// upickle.default.read[Long]("10e-1") ==> 1
}
test("taggedCustomSerializer"){
import upickle.default._

val error = intercept[java.lang.AssertionError] {
val x: TaggedCustomSerializer.BooleanOrInt = TaggedCustomSerializer.IsBoolean(false);
upickle.default.write(x)
}

assert(error.getMessage.startsWith("assertion failed: Can only merge Readers of case classes"))
}
}
}

0 comments on commit 1082187

Please sign in to comment.