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

Commit 413e4b8

Browse files
committed
バケツクラスを用いるように修正
1 parent 9c799c3 commit 413e4b8

File tree

1 file changed

+44
-18
lines changed
  • src/main/kotlin/com/wrongwrong/mapk/core

1 file changed

+44
-18
lines changed

src/main/kotlin/com/wrongwrong/mapk/core/KMapper.kt

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,64 +40,90 @@ class KMapper<T : Any> private constructor(
4040
if (parameterMap.isEmpty()) throw IllegalArgumentException("This function is not require arguments.")
4141
}
4242

43-
private fun bindParameters(targetBucket: Array<Any?>, src: Any) {
43+
private fun throwExceptionOnNotInitialized(argumentBucket: ArgumentBucket): Nothing {
44+
val notInitializedIndexes = argumentBucket.notInitializedParameterIndexes
45+
function.parameters
46+
.filter { it.index in notInitializedIndexes }
47+
.map { it.name }
48+
.joinToString(", ")
49+
.let {
50+
throw IllegalArgumentException("Not passed arguments: $it")
51+
}
52+
}
53+
54+
private fun bindArguments(argumentBucket: ArgumentBucket, src: Any) {
4455
src::class.memberProperties.forEach { property ->
4556
val javaGetter: Method? = property.javaGetter
4657
if (javaGetter != null && property.visibility == KVisibility.PUBLIC && property.annotations.none { annotation -> annotation is KPropertyIgnore }) {
4758
parameterMap[property.findAnnotation<KGetterAlias>()?.value ?: property.name]?.let {
4859
// javaGetterを呼び出す方が高速
4960
javaGetter.isAccessible = true
50-
targetBucket[it.index] = javaGetter.invoke(src)?.let { value -> mapObject(it, value) }
61+
argumentBucket.setArgument(javaGetter.invoke(src)?.let { value -> mapObject(it, value) }, it.index)
62+
// 終了判定
63+
if (argumentBucket.isInitialized) return
5164
}
5265
}
5366
}
5467
}
5568

56-
private fun bindParameters(targetBucket: Array<Any?>, src: Map<*, *>) {
69+
private fun bindArguments(argumentBucket: ArgumentBucket, src: Map<*, *>) {
5770
src.forEach { (key, value) ->
5871
parameterMap[key]?.let { param ->
5972
// 取得した内容がnullでなければ適切にmapする
60-
targetBucket[param.index] = value?.let { mapObject(param, it) }
73+
argumentBucket.setArgument(value?.let { mapObject(param, it) }, param.index)
74+
// 終了判定
75+
if (argumentBucket.isInitialized) return
6176
}
6277
}
6378
}
6479

65-
private fun bindParameters(targetBucket: Array<Any?>, srcPair: Pair<*, *>) {
66-
parameterMap.getValue(srcPair.first.toString()).let {
67-
targetBucket[it.index] = srcPair.second?.let { value -> mapObject(it, value) }
80+
private fun bindArguments(argumentBucket: ArgumentBucket, srcPair: Pair<*, *>) {
81+
parameterMap[srcPair.first.toString()]?.let {
82+
argumentBucket.setArgument(srcPair.second?.let { value -> mapObject(it, value) }, it.index)
6883
}
6984
}
7085

7186
fun map(srcMap: Map<String, Any?>): T {
72-
val bucket: Array<Any?> = function.argumentBucket
73-
bindParameters(bucket, srcMap)
87+
val bucket: ArgumentBucket = function.getArgumentBucket()
88+
bindArguments(bucket, srcMap)
89+
90+
if (!bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
91+
7492
return function.call(bucket)
7593
}
7694

7795
fun map(srcPair: Pair<String, Any?>): T {
78-
val bucket: Array<Any?> = function.argumentBucket
79-
bindParameters(bucket, srcPair)
96+
val bucket: ArgumentBucket = function.getArgumentBucket()
97+
bindArguments(bucket, srcPair)
98+
99+
if (!bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
100+
80101
return function.call(bucket)
81102
}
82103

83104
fun map(src: Any): T {
84-
val bucket: Array<Any?> = function.argumentBucket
85-
bindParameters(bucket, src)
105+
val bucket: ArgumentBucket = function.getArgumentBucket()
106+
bindArguments(bucket, src)
107+
108+
if (!bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
109+
86110
return function.call(bucket)
87111
}
88112

89113
fun map(vararg args: Any): T {
90-
val array: Array<Any?> = function.argumentBucket
114+
val bucket: ArgumentBucket = function.getArgumentBucket()
91115

92116
listOf(*args).forEach { arg ->
93117
when (arg) {
94-
is Map<*, *> -> bindParameters(array, arg)
95-
is Pair<*, *> -> bindParameters(array, arg)
96-
else -> bindParameters(array, arg)
118+
is Map<*, *> -> bindArguments(bucket, arg)
119+
is Pair<*, *> -> bindArguments(bucket, arg)
120+
else -> bindArguments(bucket, arg)
97121
}
98122
}
99123

100-
return function.call(array)
124+
if (!bucket.isInitialized) throwExceptionOnNotInitialized(bucket)
125+
126+
return function.call(bucket)
101127
}
102128
}
103129

0 commit comments

Comments
 (0)