Skip to content

Commit 70ac909

Browse files
committed
feat: add transformer/condition class reference overloads to builder
1 parent 6706fcc commit 70ac909

File tree

2 files changed

+75
-3
lines changed

2 files changed

+75
-3
lines changed

shapeshift/src/main/kotlin/dev/krud/shapeshift/builder/MappingDefinitionBuilder.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ class MappingDefinitionBuilder(val fromClazz: Class<out Any>, val toClazz: Class
4949

5050
inner class MapFieldBuilder(val from: String, val to: String) {
5151
private var condition: MappingCondition<out Any>? = null
52+
private var conditionClazz: Class<out MappingCondition<out Any>>? = null
5253
private var transformer: MappingTransformer<out Any, out Any>? = null
54+
private var transformerCoordinates: TransformerCoordinates = TransformerCoordinates.NONE
5355
private var mappingStrategy: MappingStrategy? = null
5456

5557
/**
@@ -69,6 +71,15 @@ class MappingDefinitionBuilder(val fromClazz: Class<out Any>, val toClazz: Class
6971
return this
7072
}
7173

74+
/**
75+
* Specify a condition reference to use for this mapped field
76+
* Java Example: `withCondition(Above18Condition.class)`
77+
*/
78+
fun withCondition(conditionClazz: Class<out MappingCondition<out Any>>): MapFieldBuilder {
79+
this.conditionClazz = conditionClazz
80+
return this
81+
}
82+
7283
/**
7384
* Specify a transformer to use for this mapped field
7485
* Java Example: `withTransformer(ctx -> (Integer) ctx.originalValue.toString())`
@@ -78,6 +89,15 @@ class MappingDefinitionBuilder(val fromClazz: Class<out Any>, val toClazz: Class
7889
return this
7990
}
8091

92+
/**
93+
* Specify a transformer reference to use for this mapped field
94+
* Java Example: `withTransformer(IntegerToStringTransoformer.class)`
95+
*/
96+
fun withTransformer(transformerClazz: Class<out MappingTransformer<out Any, out Any>>): MapFieldBuilder {
97+
this.transformerCoordinates = TransformerCoordinates.ofType(transformerClazz)
98+
return this
99+
}
100+
81101
/**
82102
* Specify an override mapping strategy for this mapped field
83103
*/
@@ -98,9 +118,9 @@ class MappingDefinitionBuilder(val fromClazz: Class<out Any>, val toClazz: Class
98118
val resolvedMappedField = ResolvedMappedField(
99119
resolveNodes(from.split("."), fromClazz),
100120
resolveNodes(to.split("."), toClazz),
101-
TransformerCoordinates.NONE,
121+
transformerCoordinates,
102122
transformer,
103-
null,
123+
conditionClazz,
104124
condition,
105125
mappingStrategy
106126
)

shapeshift/src/test/kotlin/dev/krud/shapeshift/builder/MappingDefinitionBuilderTests.kt

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ package dev.krud.shapeshift.builder
1212

1313
import dev.krud.shapeshift.MappingStrategy
1414
import dev.krud.shapeshift.ShapeShiftBuilder
15+
import dev.krud.shapeshift.condition.MappingCondition
16+
import dev.krud.shapeshift.condition.MappingConditionContext
17+
import dev.krud.shapeshift.transformer.base.MappingTransformer
18+
import dev.krud.shapeshift.transformer.base.MappingTransformerContext
1519
import org.junit.jupiter.api.Test
1620
import strikt.api.expectThat
1721
import strikt.assertions.isEqualTo
@@ -59,6 +63,25 @@ class MappingDefinitionBuilderTests {
5963
.isNull()
6064
}
6165

66+
@Test
67+
internal fun `test mapping with condition reference`() {
68+
val shapeShift = ShapeShiftBuilder()
69+
.excludeDefaultTransformers()
70+
.withMapping(
71+
MappingDefinitionBuilder(From::class.java, To::class.java)
72+
.mapField("name", "name")
73+
.mapField("age", "age").withCondition(Above31Condition::class.java)
74+
.build()
75+
)
76+
.build()
77+
val original = From()
78+
val result = shapeShift.map<From, To>(original)
79+
expectThat(result.name)
80+
.isEqualTo(original.name)
81+
expectThat(result.age)
82+
.isNull()
83+
}
84+
6285
@Test
6386
internal fun `test mapping with transformer`() {
6487
val shapeShift = ShapeShiftBuilder()
@@ -75,6 +98,23 @@ class MappingDefinitionBuilderTests {
7598
.isEqualTo(original.age + 1)
7699
}
77100

101+
@Test
102+
internal fun `test mapping with transformer reference`() {
103+
val shapeShift = ShapeShiftBuilder()
104+
.excludeDefaultTransformers()
105+
.withTransformer(AddOneTransformer())
106+
.withMapping(
107+
MappingDefinitionBuilder(From::class.java, To::class.java)
108+
.mapField("age", "age").withTransformer(AddOneTransformer::class.java)
109+
.build()
110+
)
111+
.build()
112+
val original = From()
113+
val result = shapeShift.map<From, To>(original)
114+
expectThat(result.age)
115+
.isEqualTo(original.age + 1)
116+
}
117+
78118
@Test
79119
internal fun `test mapping with override mapping strategy`() {
80120
val shapeShift = ShapeShiftBuilder()
@@ -109,4 +149,16 @@ class To(
109149
var age: Int? = null,
110150
var city: String? = null,
111151
val profession: String? = "placeholder"
112-
)
152+
)
153+
154+
class AddOneTransformer : MappingTransformer<Int, Int> {
155+
override fun transform(context: MappingTransformerContext<out Int>): Int {
156+
return (context.originalValue as Int) + 1
157+
}
158+
}
159+
160+
class Above31Condition : MappingCondition<Int> {
161+
override fun isValid(context: MappingConditionContext<Int>): Boolean {
162+
return context.originalValue != null && context.originalValue as Int > 31
163+
}
164+
}

0 commit comments

Comments
 (0)