This repository has been archived by the owner on Jun 23, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
#15: [refactor] Better naming; transformer -> basic type transformer,…
… as it is only one component of a "transformer" (before - FullTransformer). We are usually interested in a transformer, as it serializes all the way to json.
- Loading branch information
Showing
9 changed files
with
102 additions
and
101 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,10 @@ | ||
package org.supler | ||
|
||
import org.supler.transformation.Transformer | ||
import org.supler.transformation.{BasicTypeTransformer} | ||
|
||
case class Message(key: String, params: Any*) | ||
|
||
object Message { | ||
def apply[U](v: U, params: Any*)(implicit transformer: Transformer[U, String]) = | ||
def apply[U](v: U, params: Any*)(implicit transformer: BasicTypeTransformer[U, String]) = | ||
new Message(transformer.serialize(v), params: _*) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
72 changes: 72 additions & 0 deletions
72
supler/src/main/scala/org/supler/transformation/BasicTypeTransformer.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
package org.supler.transformation | ||
|
||
import java.text.{ParseException, SimpleDateFormat} | ||
import java.util.{Date, UUID} | ||
|
||
import org.supler.Supler | ||
import org.supler.field.{BasicFieldCompatible, RenderHint} | ||
|
||
trait BasicTypeTransformer[U, S] { | ||
def serialize(u: U): S | ||
def deserialize(s: S): Either[String, U] | ||
def renderHint: Option[RenderHint with BasicFieldCompatible] = None | ||
} | ||
|
||
// convenience traits for extension by custom transformers; one for each of the types which have a json transformer | ||
trait StringTransformer[U] extends BasicTypeTransformer[U, String] | ||
trait IntTransformer[U] extends BasicTypeTransformer[U, Int] | ||
trait LongTransformer[U] extends BasicTypeTransformer[U, Long] | ||
trait FloatTransformer[U] extends BasicTypeTransformer[U, Float] | ||
trait DoubleTransformer[U] extends BasicTypeTransformer[U, Double] | ||
trait BooleanTransformer[U] extends BasicTypeTransformer[U, Boolean] | ||
|
||
object BasicTypeTransformer { | ||
trait IdentityTransformer[U] extends BasicTypeTransformer[U, U] { | ||
override def serialize(u: U) = u | ||
override def deserialize(u: U) = Right(u) | ||
} | ||
|
||
// if the type has a corresponding json transformer, no need to transform further | ||
implicit object StringIdTransformer extends IdentityTransformer[String] | ||
implicit object IntIdTransformer extends IdentityTransformer[Int] | ||
implicit object LongIdTransformer extends IdentityTransformer[Long] | ||
implicit object FloatIdTransformer extends IdentityTransformer[Float] | ||
implicit object DoubleIdTransformer extends IdentityTransformer[Double] | ||
implicit object BooleanIdTransformer extends IdentityTransformer[Boolean] | ||
|
||
implicit object UUIDTransformer extends StringTransformer[UUID] { | ||
override def serialize(u: UUID) = u.toString | ||
|
||
override def deserialize(s: String) = try { | ||
Right(UUID.fromString(s)) | ||
} | ||
catch { | ||
case e: IllegalArgumentException => Left("error_illegalUUIDformat") | ||
} | ||
} | ||
|
||
val ISODateFormat = new SimpleDateFormat("yyyy-MM-dd") | ||
|
||
implicit object DateTransformer extends StringTransformer[Date] { | ||
override def serialize(d: Date) = ISODateFormat.format(d) | ||
|
||
override def deserialize(d: String) = try { | ||
Right(ISODateFormat.parse(d)) | ||
} | ||
catch { | ||
case e: ParseException => Left("error_illegalDateformat") | ||
} | ||
|
||
override def renderHint = Some(Supler.asDate()) | ||
} | ||
|
||
implicit def optionTransformer[U, S](implicit base: BasicTypeTransformer[U, S]): BasicTypeTransformer[Option[U], Option[S]] = | ||
new BasicTypeTransformer[Option[U], Option[S]] { | ||
override def serialize(u: Option[U]) = u.map(base.serialize) | ||
override def deserialize(s: Option[S]) = s.map(base.deserialize) match { | ||
case None => Right(None) | ||
case Some(d) => d.right.map(Some(_)) | ||
} | ||
override def renderHint = base.renderHint | ||
} | ||
} |
22 changes: 0 additions & 22 deletions
22
supler/src/main/scala/org/supler/transformation/FullTransformer.scala
This file was deleted.
Oops, something went wrong.
77 changes: 14 additions & 63 deletions
77
supler/src/main/scala/org/supler/transformation/Transformer.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,72 +1,23 @@ | ||
package org.supler.transformation | ||
|
||
import java.text.{ParseException, SimpleDateFormat} | ||
import java.util.{Date, UUID} | ||
|
||
import org.supler.Supler | ||
import org.json4s.JValue | ||
import org.supler.field.{BasicFieldCompatible, RenderHint} | ||
|
||
trait Transformer[U, S] { | ||
def serialize(u: U): S | ||
def deserialize(s: S): Either[String, U] | ||
def renderHint: Option[RenderHint with BasicFieldCompatible] = None | ||
} | ||
|
||
// convenience traits for extension by custom transformers; one for each of the types which have a json transformer | ||
trait StringTransformer[U] extends Transformer[U, String] | ||
trait IntTransformer[U] extends Transformer[U, Int] | ||
trait LongTransformer[U] extends Transformer[U, Long] | ||
trait FloatTransformer[U] extends Transformer[U, Float] | ||
trait DoubleTransformer[U] extends Transformer[U, Double] | ||
trait BooleanTransformer[U] extends Transformer[U, Boolean] | ||
|
||
object Transformer { | ||
trait IdentityTransformer[U] extends Transformer[U, U] { | ||
override def serialize(u: U) = u | ||
override def deserialize(u: U) = Right(u) | ||
} | ||
|
||
// if the type has a corresponding json transformer, no need to transform further | ||
implicit object StringIdTransformer extends IdentityTransformer[String] | ||
implicit object IntIdTransformer extends IdentityTransformer[Int] | ||
implicit object LongIdTransformer extends IdentityTransformer[Long] | ||
implicit object FloatIdTransformer extends IdentityTransformer[Float] | ||
implicit object DoubleIdTransformer extends IdentityTransformer[Double] | ||
implicit object BooleanIdTransformer extends IdentityTransformer[Boolean] | ||
class Transformer[U, S](basicTypeTransformer: BasicTypeTransformer[U, S], jsonTransformer: JsonTransformer[S]) { | ||
def serialize(u: U): Option[JValue] = jsonTransformer.toJValue(basicTypeTransformer.serialize(u)) | ||
|
||
implicit object UUIDTransformer extends StringTransformer[UUID] { | ||
override def serialize(u: UUID) = u.toString | ||
def deserialize(jvalue: JValue): Either[String, U] = for { | ||
s <- jsonTransformer.fromJValue.lift(jvalue).toRight("cannot convert json value").right | ||
u <- basicTypeTransformer.deserialize(s).right | ||
} yield u | ||
|
||
override def deserialize(s: String) = try { | ||
Right(UUID.fromString(s)) | ||
} | ||
catch { | ||
case e: IllegalArgumentException => Left("error_illegalUUIDformat") | ||
} | ||
} | ||
def jsonSchemaName = jsonTransformer.jsonSchemaName | ||
|
||
val ISODateFormat = new SimpleDateFormat("yyyy-MM-dd") | ||
|
||
implicit object DateTransformer extends StringTransformer[Date] { | ||
override def serialize(d: Date) = ISODateFormat.format(d) | ||
|
||
override def deserialize(d: String) = try { | ||
Right(ISODateFormat.parse(d)) | ||
} | ||
catch { | ||
case e: ParseException => Left("error_illegalDateformat") | ||
} | ||
|
||
override def renderHint = Some(Supler.asDate()) | ||
} | ||
def renderHint: Option[RenderHint with BasicFieldCompatible] = basicTypeTransformer.renderHint | ||
} | ||
|
||
implicit def optionTransformer[U, S](implicit base: Transformer[U, S]): Transformer[Option[U], Option[S]] = | ||
new Transformer[Option[U], Option[S]] { | ||
override def serialize(u: Option[U]) = u.map(base.serialize) | ||
override def deserialize(s: Option[S]) = s.map(base.deserialize) match { | ||
case None => Right(None) | ||
case Some(d) => d.right.map(Some(_)) | ||
} | ||
override def renderHint = base.renderHint | ||
} | ||
object Transformer { | ||
implicit def create[U, S]( | ||
implicit basicTypeTransformer: BasicTypeTransformer[U, S], jsonTransformer: JsonTransformer[S]): Transformer[U, S] = | ||
new Transformer[U, S](basicTypeTransformer, jsonTransformer) | ||
} |