Kold is a type-safe validation library for Kotlin.
What's it for
This library is for validating raw data before constructing an object.
When to use it
There are a couple of use-cases
- Validating value-objects like
EmailAddress
- Validating fields of an object
Validating value-objects
Imagine you have some values that should follow certain rules to be valid like email address.
We create a wrapper-types for such values, making constructor private and allowing to construct such wrappers only via factory methods which return instance of Validated
.
class EmailAddress private constructor(val value: String) {
companion object {
fun fromString(email: String): Validated<EmailAddress> {
val violations = buildList {
if (email.length > 2048) {
add(ValueViolation("value.too.long", "Email address can't be longer than 2048 characters"))
}
if (!email.contains("@")) {
add(ValueViolation("value.invalid", "Email address is invalid format"))
}
}
return if (violations.isEmpty()) {
Validated.Valid(EmailAddress(email))
} else {
Validated.Invalid(violations)
}
}
}
}
Validating fields of an object
We want to validate a complex object that contains a few fields, we get data from an API in JSON-like format. We convert raw data to KoldData
, there are helper functions for that. Then we validate that data and convert to a desired class.
data class User(
val name: String,
val password: String?,
val age: Int,
val score: Double?
)
fun validateUser(input: KoldData): Validated<User> =
input.validationContext {
combineFields(
require("name").validateValue { it.string() },
opt("password").validateOption { it.string() },
require("age").validateValue { it.long() },
opt("score").validateOption { it.double() }
) { name, password, age, score ->
User(name, password, age.toInt(), score)
}
}
More examples can be found in kold-examples
module.
KoldData
KoldData is a type safe representation of json-like data. It allows you to store strings, numbers, booleans and also arrays and objects containing fields of such types.