Marshall
07/23/2020, 4:27 PMinterface ErrorCheck<T> {
fun isValid(item: T): Boolean
}
class PropertyRangeCheck<T, R : Comparable<R>>(val prop: KProperty1<T, R>, val range: ClosedRange<R>) : ErrorCheck<T> {
override fun isValid(item: T) = range.contains(prop.get(item))
}
class PropertyStringLengthCheck<T>(val prop: KProperty1<T, String>, val range: IntRange) : ErrorCheck<T>{
override fun isValid(item: T) = range.contains(prop.get(item).length)
}
Marshall
07/23/2020, 4:28 PMval model1checks = listOf(
PropertyRangeCheck(DataClass::id, 1.rangeTo(4094)),
PropertyRangeCheck(DataClass::time, 0.0f.rangeTo(2.0f)),
PropertyStringLengthCheck(DataClass::name, 1.rangeTo(80))
)
Marshall
07/23/2020, 4:29 PMMarshall
07/23/2020, 4:30 PMpavi2410
07/23/2020, 8:28 PMinit
block along with require
function to validate the Model like this
data class User(val name: String, val email: String, val age: Int) {
init {
require(name.isNotEmpty()) { "name must not be empty" }
require(email.isValidEmail()) { "email is not valid" }
require(age >= 18) { "age must be greater than or equal to 18 years" }
}
}
Marshall
07/23/2020, 8:31 PMMarshall
07/23/2020, 8:33 PMMarshall
07/23/2020, 8:35 PMJoão Gonçalves
07/24/2020, 12:54 AMdata class Person(val age: Int, val name: String)
val validations = listOf(
PropertyRangeCheck(Person::age, 18.rangeTo(40)),
PropertyStringLengthCheck(Person::name, 1.rangeTo(5))
)
val john = Person(7, "John")
validations.map {
Pair(it.isValid(john), listOf(it.errorMessage()))
}.reduce { acc, pair ->
Pair(acc.first && pair.first, acc.second + pair.second)
}.let {
println(it)
}
// (false, [Out of range, Invalid size])
Added errorMessage
to ErrorCheck
Marshall
07/24/2020, 2:08 AM