Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.

Commit c5d312c

Browse files
authored
Merge pull request #10 from k163377/feature
Added support for mapping with default arguments.
2 parents 164cbf6 + 9b715e3 commit c5d312c

File tree

3 files changed

+6
-30
lines changed

3 files changed

+6
-30
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ repositories {
3030
dependencies {
3131
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
3232
implementation(kotlin("reflect"))
33-
implementation("com.github.ProjectMapK:Shared:0.3")
33+
implementation("com.github.ProjectMapK:Shared:0.4")
3434

3535
// https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter
3636
testImplementation(group = "org.junit.jupiter", name = "junit-jupiter", version = "5.6.0") {

src/main/kotlin/com/mapk/kmapper/KMapper.kt

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,6 @@ class KMapper<T : Any> private constructor(
3939
ParameterForMap.newInstance(it)
4040
}
4141

42-
private fun throwExceptionOnNotInitialized(argumentBucket: ArgumentBucket): Nothing {
43-
val notInitializedIndexes = argumentBucket.notInitializedParameterIndexes
44-
function.parameters
45-
.filter { it.index in notInitializedIndexes }
46-
.map { it.name }
47-
.joinToString(", ")
48-
.let {
49-
throw IllegalArgumentException("Not passed arguments: $it")
50-
}
51-
}
52-
5342
private fun bindArguments(argumentBucket: ArgumentBucket, src: Any) {
5443
src::class.memberProperties.forEach outer@{ property ->
5544
// propertyが公開されていない場合は処理を行わない
@@ -68,7 +57,7 @@ class KMapper<T : Any> private constructor(
6857
parameterMap[alias ?: property.name]?.let {
6958
// javaGetterを呼び出す方が高速
7059
javaGetter.isAccessible = true
71-
argumentBucket.setArgument(javaGetter.invoke(src)?.let { value -> mapObject(it, value) }, it.index)
60+
argumentBucket.setArgument(it.param, javaGetter.invoke(src)?.let { value -> mapObject(it, value) })
7261
// 終了判定
7362
if (argumentBucket.isInitialized) return
7463
}
@@ -79,7 +68,7 @@ class KMapper<T : Any> private constructor(
7968
src.forEach { (key, value) ->
8069
parameterMap[key]?.let { param ->
8170
// 取得した内容がnullでなければ適切にmapする
82-
argumentBucket.setArgument(value?.let { mapObject(param, it) }, param.index)
71+
argumentBucket.setArgument(param.param, value?.let { mapObject(param, it) })
8372
// 終了判定
8473
if (argumentBucket.isInitialized) return
8574
}
@@ -88,39 +77,28 @@ class KMapper<T : Any> private constructor(
8877

8978
private fun bindArguments(argumentBucket: ArgumentBucket, srcPair: Pair<*, *>) {
9079
parameterMap[srcPair.first.toString()]?.let {
91-
argumentBucket.setArgument(srcPair.second?.let { value ->
92-
mapObject(
93-
it,
94-
value
95-
)
96-
}, it.index)
80+
argumentBucket.setArgument(it.param, srcPair.second?.let { value -> mapObject(it, value) })
9781
}
9882
}
9983

10084
fun map(srcMap: Map<String, Any?>): T {
10185
val bucket: ArgumentBucket = function.getArgumentBucket()
10286
bindArguments(bucket, srcMap)
10387

104-
if (!bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
105-
10688
return function.call(bucket)
10789
}
10890

10991
fun map(srcPair: Pair<String, Any?>): T {
11092
val bucket: ArgumentBucket = function.getArgumentBucket()
11193
bindArguments(bucket, srcPair)
11294

113-
if (!bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
114-
11595
return function.call(bucket)
11696
}
11797

11898
fun map(src: Any): T {
11999
val bucket: ArgumentBucket = function.getArgumentBucket()
120100
bindArguments(bucket, src)
121101

122-
if (!bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
123-
124102
return function.call(bucket)
125103
}
126104

@@ -135,8 +113,6 @@ class KMapper<T : Any> private constructor(
135113
}
136114
}
137115

138-
if (!bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
139-
140116
return function.call(bucket)
141117
}
142118
}

src/main/kotlin/com/mapk/kmapper/ParameterForMap.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import kotlin.reflect.full.isSubclassOf
1111
import kotlin.reflect.full.staticFunctions
1212
import kotlin.reflect.jvm.isAccessible
1313

14-
internal class ParameterForMap<T : Any> private constructor(val index: Int, val clazz: KClass<T>) {
14+
internal class ParameterForMap<T : Any> private constructor(val param: KParameter, val clazz: KClass<T>) {
1515
val javaClazz: Class<T> by lazy {
1616
clazz.java
1717
}
@@ -28,7 +28,7 @@ internal class ParameterForMap<T : Any> private constructor(val index: Int, val
2828

2929
companion object {
3030
fun newInstance(param: KParameter): ParameterForMap<*> {
31-
return ParameterForMap(param.index, param.type.classifier as KClass<*>)
31+
return ParameterForMap(param, param.type.classifier as KClass<*>)
3232
}
3333
}
3434
}

0 commit comments

Comments
 (0)