Skip to content

Commit

Permalink
Merge pull request #503 from morgen-peschke/extend-serializable
Browse files Browse the repository at this point in the history
Have FUUID extend Serializable
  • Loading branch information
ChristopherDavenport authored Feb 21, 2023
2 parents 78404f9 + 08cc076 commit 2e17ed5
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package io.chrisdavenport.fuuid

import cats.ApplicativeThrow
import cats.effect.IO
import munit.CatsEffectSuite

import java.io.{ByteArrayInputStream, ByteArrayOutputStream, ObjectInputStream, ObjectOutputStream}
import scala.reflect.ClassTag

class FUUIDJvmSpec extends CatsEffectSuite {
test("FUUID.nameBased") {
test("produce a valid UUID") {
Expand All @@ -22,4 +26,31 @@ class FUUIDJvmSpec extends CatsEffectSuite {
FUUID.nameBased[IO](namespace, name).assertEquals(expected)
}
}

test("FUUID.fuuid survives Java serialization") {
def serialize(fuuid: FUUID): IO[Array[Byte]] = {
ApplicativeThrow[IO].catchNonFatal {
val byteStream = new ByteArrayOutputStream()
val objectStream = new ObjectOutputStream(byteStream)
objectStream.writeObject(fuuid)
objectStream.close()
byteStream.toByteArray
}
}

def deserialize(bytes: Array[Byte]): IO[FUUID] = ApplicativeThrow[IO].catchNonFatal {
val byteStream = new ByteArrayInputStream(bytes)
val objectStream = new ObjectInputStream(byteStream)
val obj = objectStream.readObject()
val clazz = implicitly[ClassTag[FUUID]]
obj match {
case clazz(fuuid) => fuuid
case _ => fail("deserialized value not recognized as FUUID", clues(obj))
}
}

FUUID.randomFUUID[IO].flatMap { original =>
serialize(original).flatMap(deserialize).assertEquals(original)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import java.util.UUID

import scala.reflect.macros.blackbox

final class FUUID private (private val uuid: UUID) {
final class FUUID private (private val uuid: UUID) extends Serializable {

// Direct show method so people do not use toString
def show: String = uuid.show
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import compiletime.asMatchable
import java.util.UUID
import scala.quoted.*

final class FUUID private (private val uuid: UUID) {
final class FUUID private (private val uuid: UUID) extends Serializable {

// Direct show method so people do not use toString
def show: String = uuid.show
Expand Down
2 changes: 2 additions & 0 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6")
addSbtPlugin("io.github.davidgregory084" % "sbt-tpolecat" % "0.3.1")
addSbtPlugin("io.chrisdavenport" % "sbt-davenverse" % "0.1.4")

libraryDependencies += "org.scala-js" %% "scalajs-env-nodejs" % "1.2.1"

0 comments on commit 2e17ed5

Please sign in to comment.