Stanislav Kral
06/24/2021, 8:17 AMConfigValidator.validate
method.
Any other comments or possible improvements to the code below are also welcome.
Thanks!
class ConfigValidator(private val configRules: List<Rule>) {
abstract class Rule {
abstract fun validateConfig(model: InitModel): RuleViolation?
}
fun validate(model: InitModel) = configRules.map {
// !!! is there any way to make this stop mapping items when the first RuleViolation is found? !!!
// this method needs to return "RuleViolation?"
it.validateConfig(model)
}.firstOrNull()
class SimpleRule1(...) : Rule() {
override fun validateConfig(model: InitModel): RuleViolation? =
model.items.firstOrNull {
// some condition for model item
}?.let {
RuleViolation(1, "Rule violation description")
}
}
class SimpleRule2(...) : Rule() {
override fun validateConfig(model: InitModel): RuleViolation? =
model.items.firstOrNull {
// some condition for model item
}?.let {
RuleViolation(2, "Rule 2 violation description")
}
}
class RuleViolation(val code: Int, message: String) : Exception(message)
}
ephemient
06/24/2021, 8:28 AMephemient
06/24/2021, 8:29 AM.firstNotNullOfOrNull()
, e.g.
fun validate(model: InitModel): RuleViolation? = configRules.firstNotNullOfOrNull { it.validateConfig(model) }
Stanislav Kral
06/24/2021, 8:33 AMv1.4.21
, but I may be allowed to update it.
Thank you one more time.Stanislav Kral
06/24/2021, 8:37 AMephemient
06/24/2021, 8:38 AMMranders
06/24/2021, 9:01 AMfun main() {
val numbers = listOf(10, 20, -10, 30, 40)
val result = numbers
.mapNotNull {
println("Without sequence visiting $it")
bogusValidation(it)
}
.firstOrNull()
println("result without sequence was $result")
val resultFromSeq = numbers
.asSequence()
.mapNotNull {
println("With sequence visiting $it")
bogusValidation(it)
}
.firstOrNull()
println("result with sequence was $resultFromSeq")
}
private fun bogusValidation(i: Int) = i.takeIf { it < 0 }
ephemient
06/24/2021, 9:12 AMfun validate(model: InitModel): RuleViolation? {
for (rule in configRules) return rule.validateConfig(model) ?: continue
return null
}
but either option works