diff options
author | vlad <vlad@driver.xyz> | 2017-10-20 14:17:05 -0700 |
---|---|---|
committer | vlad <vlad@driver.xyz> | 2017-10-20 14:17:05 -0700 |
commit | fc2f37b4a3c22747d0e913a2b7a379dbe7e9e7d1 (patch) | |
tree | 392385b9ad5d15160fd45453f34f68d389633fc2 /src/main/scala/xyz/driver/core/json.scala | |
parent | c13a90f7dc6565e0beddcc6a61609d4e131f55ba (diff) | |
download | driver-core-fc2f37b4a3c22747d0e913a2b7a379dbe7e9e7d1.tar.gz driver-core-fc2f37b4a3c22747d0e913a2b7a379dbe7e9e7d1.tar.bz2 driver-core-fc2f37b4a3c22747d0e913a2b7a379dbe7e9e7d1.zip |
Slick support for any Refined types, JSON format and generator for NonEmptyName, Unit-tests
Diffstat (limited to 'src/main/scala/xyz/driver/core/json.scala')
-rw-r--r-- | src/main/scala/xyz/driver/core/json.scala | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/main/scala/xyz/driver/core/json.scala b/src/main/scala/xyz/driver/core/json.scala index c14424d..6b27a9c 100644 --- a/src/main/scala/xyz/driver/core/json.scala +++ b/src/main/scala/xyz/driver/core/json.scala @@ -16,6 +16,7 @@ import xyz.driver.core.domain.{Email, PhoneNumber} import xyz.driver.core.time.Time import eu.timepit.refined.refineV import eu.timepit.refined.api.{Refined, Validate} +import eu.timepit.refined.collection.NonEmpty object json { import DefaultJsonProtocol._ @@ -232,6 +233,25 @@ object json { } } + def NonEmptyNameInPath[T]: PathMatcher1[NonEmptyName[T]] = new PathMatcher1[NonEmptyName[T]] { + def apply(path: Path) = path match { + case Path.Segment(segment, tail) => + refineV[NonEmpty](segment) match { + case Left(_) => Unmatched + case Right(nonEmptyString) => Matched(tail, Tuple1(NonEmptyName[T](nonEmptyString))) + } + case _ => Unmatched + } + } + + implicit def nonEmptyNameFormat[T](implicit nonEmptyStringFormat: JsonFormat[Refined[String, NonEmpty]]) = + new RootJsonFormat[NonEmptyName[T]] { + def write(name: NonEmptyName[T]) = JsString(name.value.value) + + def read(value: JsValue): NonEmptyName[T] = + NonEmptyName[T](nonEmptyStringFormat.read(value)) + } + val jsValueToStringMarshaller: Marshaller[JsValue, String] = Marshaller.strict[JsValue, String](value => Marshalling.Opaque[String](() => value.compactPrint)) |