aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZach Smith <zach@driver.xyz>2017-12-20 12:34:56 -0800
committerZach Smith <zach@driver.xyz>2017-12-20 12:34:56 -0800
commit1286317ff473265333a3809d1038aa133fd6d662 (patch)
treeb7a33c39fabc453a6652b58e355e440b874d7e9d
parenta2adb740d8abec507846bffb52c764e9226a7817 (diff)
downloaddriver-core-1286317ff473265333a3809d1038aa133fd6d662.tar.gz
driver-core-1286317ff473265333a3809d1038aa133fd6d662.tar.bz2
driver-core-1286317ff473265333a3809d1038aa133fd6d662.zip
Add InetAddress JSON format
-rw-r--r--src/main/scala/xyz/driver/core/json.scala13
-rw-r--r--src/test/scala/xyz/driver/core/JsonTest.scala19
2 files changed, 32 insertions, 0 deletions
diff --git a/src/main/scala/xyz/driver/core/json.scala b/src/main/scala/xyz/driver/core/json.scala
index 313849c..e338638 100644
--- a/src/main/scala/xyz/driver/core/json.scala
+++ b/src/main/scala/xyz/driver/core/json.scala
@@ -1,5 +1,6 @@
package xyz.driver.core
+import java.net.InetAddress
import java.util.UUID
import scala.reflect.runtime.universe._
@@ -143,6 +144,18 @@ object json {
implicit val authCredentialsFormat = jsonFormat2(AuthCredentials)
+ implicit object inetAddressFormat extends JsonFormat[InetAddress] {
+ override def read(json: JsValue): InetAddress = json match {
+ case JsString(ipString) =>
+ Try(InetAddress.getByName(ipString))
+ .getOrElse(deserializationError(s"Invalid IP Address: $ipString"))
+ case _ => deserializationError(s"Expected string for IP Address, got $json")
+ }
+
+ override def write(obj: InetAddress): JsValue =
+ JsString(obj.getHostAddress)
+ }
+
class EnumJsonFormat[T](mapping: (String, T)*) extends RootJsonFormat[T] {
private val map = mapping.toMap
diff --git a/src/test/scala/xyz/driver/core/JsonTest.scala b/src/test/scala/xyz/driver/core/JsonTest.scala
index 26e3796..a45025a 100644
--- a/src/test/scala/xyz/driver/core/JsonTest.scala
+++ b/src/test/scala/xyz/driver/core/JsonTest.scala
@@ -1,5 +1,7 @@
package xyz.driver.core
+import java.net.InetAddress
+
import eu.timepit.refined.collection.NonEmpty
import eu.timepit.refined.numeric.Positive
import eu.timepit.refined.refineMV
@@ -198,4 +200,21 @@ class JsonTest extends FlatSpec with Matchers {
val parsedRefinedNumber = jsonFormat.read(writtenJson)
parsedRefinedNumber should be(referenceRefinedNumber)
}
+
+ "InetAddress format" should "read and write correct JSON" in {
+ val address = InetAddress.getByName("127.0.0.1")
+ val json = inetAddressFormat.write(address)
+
+ json shouldBe JsString("127.0.0.1")
+
+ val parsed = inetAddressFormat.read(json)
+ parsed shouldBe address
+ }
+
+ it should "throw a DeserializationException for an invalid IP Address" in {
+ assertThrows[DeserializationException] {
+ val invalidAddress = JsString("foobar")
+ inetAddressFormat.read(invalidAddress)
+ }
+ }
}