Skip to content

Commit bca9548

Browse files
committed
feat: add automap option to builder
1 parent 70ac909 commit bca9548

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

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

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ import dev.krud.shapeshift.MappingStrategy
1414
import dev.krud.shapeshift.condition.MappingCondition
1515
import dev.krud.shapeshift.dto.ResolvedMappedField
1616
import dev.krud.shapeshift.dto.TransformerCoordinates
17+
import dev.krud.shapeshift.enums.AutoMappingStrategy
1718
import dev.krud.shapeshift.resolver.MappingDefinition
1819
import dev.krud.shapeshift.transformer.base.MappingTransformer
20+
import dev.krud.shapeshift.util.getAutoMappings
1921
import dev.krud.shapeshift.util.getDeclaredFieldRecursive
2022
import java.lang.reflect.Field
2123

@@ -24,6 +26,22 @@ import java.lang.reflect.Field
2426
*/
2527
class MappingDefinitionBuilder(val fromClazz: Class<out Any>, val toClazz: Class<out Any>) {
2628
private val resolvedMappedFields = mutableListOf<ResolvedMappedField>()
29+
private var autoMappingStrategy: AutoMappingStrategy = AutoMappingStrategy.NONE
30+
31+
/**
32+
* Automatically map all fields with the given strategy
33+
*/
34+
fun autoMap(strategy: AutoMappingStrategy): MappingDefinitionBuilder {
35+
this.autoMappingStrategy = strategy
36+
return this
37+
}
38+
39+
/**
40+
* Automatically map all fields with the given strategy with strategy [AutoMappingStrategy.BY_NAME_AND_TYPE]
41+
*/
42+
fun autoMap(): MappingDefinitionBuilder {
43+
return autoMap(AutoMappingStrategy.BY_NAME_AND_TYPE)
44+
}
2745

2846
/**
2947
* Define a new mapped field, along with an optional condition, transformer and override mapping strategy
@@ -40,10 +58,16 @@ class MappingDefinitionBuilder(val fromClazz: Class<out Any>, val toClazz: Class
4058
* Return a mapping definition for the fields defined in this builder
4159
*/
4260
fun build(): MappingDefinition {
61+
val autoMappedFields = getAutoMappings(fromClazz, toClazz, autoMappingStrategy)
62+
.filter { autoResolvedMappedField ->
63+
resolvedMappedFields.none {
64+
it.mapFromCoordinates.first() == autoResolvedMappedField.mapFromCoordinates.first() || it.mapToCoordinates.first() == autoResolvedMappedField.mapToCoordinates.first()
65+
}
66+
}
4367
return MappingDefinition(
4468
fromClazz,
4569
toClazz,
46-
resolvedMappedFields
70+
resolvedMappedFields + autoMappedFields
4771
)
4872
}
4973

@@ -54,6 +78,22 @@ class MappingDefinitionBuilder(val fromClazz: Class<out Any>, val toClazz: Class
5478
private var transformerCoordinates: TransformerCoordinates = TransformerCoordinates.NONE
5579
private var mappingStrategy: MappingStrategy? = null
5680

81+
/**
82+
* @see MappingDefinitionBuilder.autoMap
83+
*/
84+
fun autoMap(strategy: AutoMappingStrategy): MappingDefinitionBuilder {
85+
buildAndAddSelf()
86+
return this@MappingDefinitionBuilder.autoMap(strategy)
87+
}
88+
89+
/**
90+
* @see MappingDefinitionBuilder.autoMap
91+
*/
92+
fun autoMap(): MappingDefinitionBuilder {
93+
buildAndAddSelf()
94+
return this@MappingDefinitionBuilder.autoMap()
95+
}
96+
5797
/**
5898
* @see MappingDefinitionBuilder.mapField
5999
*/

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,26 @@ class MappingDefinitionBuilderTests {
131131
expectThat(result.profession)
132132
.isNull()
133133
}
134+
135+
@Test
136+
internal fun `test auto mapping`() {
137+
val shapeShift = ShapeShiftBuilder()
138+
.excludeDefaultTransformers()
139+
.withMapping(
140+
MappingDefinitionBuilder(From::class.java, To::class.java)
141+
.autoMap()
142+
.build()
143+
)
144+
.build()
145+
val original = From(profession = "Test")
146+
val result = shapeShift.map<From, To>(original)
147+
expectThat(result.name)
148+
.isEqualTo(original.name)
149+
expectThat(result.age)
150+
.isEqualTo(original.age)
151+
expectThat(result.profession)
152+
.isEqualTo(original.profession)
153+
}
134154
}
135155

136156
class From(

0 commit comments

Comments
 (0)