Coverage Summary for Class: BasicTypeTransformer (com.kotlinorm.beans.transformers)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
BasicTypeTransformer |
100%
(1/1)
|
100%
(5/5)
|
90%
(18/20)
|
92.6%
(25/27)
|
92.8%
(181/195)
|
/**
* Copyright 2022-2025 kronos-orm
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kotlinorm.beans.transformers
import com.kotlinorm.interfaces.ValueTransformer
import kotlin.reflect.KClass
/**
* Transformer for basic types.
*
* @author OUSC
*/
object BasicTypeTransformer : ValueTransformer {
private val basicTypes = listOf(
"kotlin.Int",
"kotlin.Long",
"kotlin.Double",
"kotlin.Float",
"kotlin.Boolean",
"kotlin.Char",
"kotlin.Byte",
"kotlin.Short"
)
/**
* Safely casts the value to the target type.
*
* @param fromNumber A lambda to convert from a Number.
* @param fromStr A lambda to convert from a String.
* @return The value cast to the target type.
*/
private fun <T> Any.safeCast(fromNumber: Number.() -> T, fromStr: String.() -> T): T {
return if (this is Number) {
fromNumber()
} else {
toString().fromStr()
}
}
private fun Any.toChar(): Char {
return if (this is Number) {
toInt().toChar()
} else {
toString().first()
}
}
override fun isMatch(targetKotlinType: String, superTypesOfValue: List<String>, kClassOfValue: KClass<*>): Boolean {
return targetKotlinType in basicTypes
}
override fun transform(
targetKotlinType: String,
value: Any,
superTypesOfValue: List<String>,
dateTimeFormat: String?,
kClassOfValue: KClass<*>
): Any {
return when (targetKotlinType) {
"kotlin.Int" -> value.safeCast(Number::toInt, String::toInt)
"kotlin.Long" -> value.safeCast(Number::toLong, String::toLong)
"kotlin.Short" -> value.safeCast(Number::toShort, String::toShort)
"kotlin.Float" -> value.safeCast(Number::toFloat, String::toFloat)
"kotlin.Double" -> value.safeCast(Number::toDouble, String::toDouble)
"kotlin.Byte" -> value.safeCast(Number::toByte, String::toByte)
"kotlin.Char" -> value.toChar()
"kotlin.Boolean" -> (value is Number && value != 0) || value.toString().ifBlank { "false" }.toBoolean()
else -> null
} ?: throw IllegalArgumentException("Invalid type: $targetKotlinType")
}
}