未验证 提交 5326f4ee 编写于 作者: 梦境迷离's avatar 梦境迷离 提交者: GitHub

add TransformableSyntax (#231)

* add TransformableSyntax
上级 9c536329
package org.bitlap.common
import org.bitlap.common.internal.TransformerMacro
/** @author
* 梦境迷离
* @version 1.0,2022/7/29
*/
trait TransformableSyntax[From <: Product, To <: Product] { self =>
val transformer: Transformer[From, To]
def Syntax: Transformable[From, To] = macro TransformerMacro.applyImpl[From, To]
implicit val _self: TransformableSyntax[From, To] = self
}
......@@ -72,4 +72,9 @@ package object common {
implicit final class TransformerOps[F](private val from: F) extends AnyVal {
final def transform[T](implicit transformer: Transformer[F, T]): T = transformer.transform(from)
}
implicit final class TransformableSyntaxOps[F <: Product](private val from: F) extends AnyVal {
final def transformCaseClass[T <: Product](implicit transformableSyntax: TransformableSyntax[F, T]): T =
transformableSyntax.transformer.transform(from)
}
}
......@@ -508,4 +508,53 @@ class TransformableTest extends AnyFlatSpec with Matchers {
| a.transform[A2](b1)
|""".stripMargin shouldNot compile
}
"TransformableTest extends TransformableOps" should "compile ok" in {
case class A1(a: Option[String], b: Boolean)
object A1 extends TransformableSyntax[A1, A2] {
override val transformer: Transformer[A1, A2] =
Syntax
.setName(_.a, _.b)
.setName(_.b, _.c)
.setType[Boolean, String](_.b, _.toString)
.setDefaultValue(_.b, None)
.instance
}
case class A2(
b: Option[String],
c: String,
e: Option[String] = Some("option")
)
val a = A1(Some("hello a"), false)
a.transformCaseClass[A2].toString shouldEqual "A2(Some(hello a),false,Some(option))"
}
"TransformableTest extends TransformableOps" should "ok" in {
case class A1(d: Option[String])
object A1 extends TransformableSyntax[A1, A2] {
override val transformer: Transformer[A1, A2] =
Syntax
.setDefaultValue(_.f, Option("1"))
.disableCollectionDefaultsToEmpty // use default value, not None
.disableOptionDefaultsToNone // use default value, not Empty
.instance
}
case class A2(
d: Option[String],
e: Option[String] = Some("option"),
f: Option[String] = None,
h: List[String] = List("list"),
i: List[String] = List.empty
)
val a = A1(Some("hello a"))
a.transformCaseClass[A2].toString shouldEqual "A2(Some(hello a),Some(option),Some(1),List(list),List())"
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册