@@ -8,7 +8,11 @@ import kotlin.reflect.KFunction
88import kotlin.reflect.KParameter
99import kotlin.reflect.full.isSuperclassOf
1010
11- internal class ParameterForMap <T : Any > private constructor(val param : KParameter , private val clazz : KClass <T >) {
11+ internal class ParameterForMap <T : Any > private constructor(
12+ val param : KParameter ,
13+ private val clazz : KClass <T >,
14+ private val parameterNameConverter : (String ) -> String
15+ ) {
1216 private val javaClazz: Class <T > by lazy {
1317 clazz.java
1418 }
@@ -38,15 +42,18 @@ internal class ParameterForMap<T : Any> private constructor(val param: KParamete
3842 javaClazz.isEnum && value is String -> ParameterProcessor .ToEnum (javaClazz)
3943 // 要求されているパラメータがStringならtoStringする
4044 clazz == String ::class -> ParameterProcessor .ToString
41- else -> throw IllegalArgumentException (" Can not convert $valueClazz to $clazz " )
45+ // 入力がmapもしくはpairなら、KMapperを用いてマッピングを試みる
46+ value is Map <* , * > || value is Pair <* , * > ->
47+ ParameterProcessor .UseKMapper (KMapper (clazz, parameterNameConverter))
48+ else -> ParameterProcessor .UseBoundKMapper (BoundKMapper (clazz, valueClazz, parameterNameConverter))
4249 }
4350 convertCache.putIfAbsent(valueClazz, processor)
4451 return processor.process(value)
4552 }
4653
4754 companion object {
48- fun newInstance (param : KParameter ): ParameterForMap <* > {
49- return ParameterForMap (param, param.type.classifier as KClass <* >)
55+ fun newInstance (param : KParameter , parameterNameConverter : ( String ) -> String ): ParameterForMap <* > {
56+ return ParameterForMap (param, param.type.classifier as KClass <* >, parameterNameConverter )
5057 }
5158 }
5259}
0 commit comments