Akkurate
Akkurate 是一个利用 Kotlin 表达能力的验证库。无需 30 多个注解或复杂的自定义约束;使用优雅的声明式 API 用 Kotlin 编写验证代码。
该库从零开始设计,旨在处理复杂的业务逻辑,其作用是帮助您编写高质量且易于维护的验证代码。
[!警告] Akkurate 正在开发中,尽管经过大量测试,但其 API 尚未稳定;次要版本可能会发生重大变更。 然而,我们将始终提供迁移指南。
请在 GitHub 仓库 中报告任何问题或错误。
示例
以下是一个展示如何约束一本书及其作者列表的示例。
// 定义你的类
@Validate
data class Book(
val title: String,
val releaseDate: LocalDateTime,
val authors: List<Author>,
)
@Validate
data class Author(val firstName: String, val lastName: String)
// 编写验证规则
val validateBook = Validator<Book> {
// 首先是属性,然后是约束,最后是消息。
title.isNotEmpty() otherwise { "缺少标题" }
releaseDate.isInPast() otherwise { "发布日期必须是过去时间" }
authors.hasSizeBetween(1..10) otherwise { "作者数量错误" }
authors.each { // 对每个作者应用约束
(firstName and lastName) {
// 对两个属性应用相同的约束
isNotEmpty() otherwise { "缺少姓名" }
}
}
}
// 验证你的数据
when (val result = validateBook(someBook)) {
is Success -> println("成功:${result.value}")
is Failure -> {
val list = result.violations
.joinToString("\n") { "${it.path}: ${it.message}" }
println("失败:\n$list")
}
}
注意每个应用于属性的约束都可以像一个句子一样阅读。这段代码:
title.isNotEmpty() otherwise { "缺少标题" }
可以理解为:
检查'title'是否非空,否则写入"缺少标题"。
特性
-
优雅的 DSL 和 API
编写清晰明了的验证代码并保持DRY 。需要时可以使用循环和条件;忘掉注解地狱吧。 -
捆绑了所有基本约束
只为你的业务逻辑编写自定义约束,其他的都交给我们! -
易于扩展且高度可扩展
无需编写冗长的代码来创建自定义约束,在 Akkurate 中,它们就像带参数的 lambda 一样简单。 -
上下文相关和异步
需要时随时查询同步/异步数据源,如数据库或 REST API。一切都可以在验证内部进行。 -
与你喜欢的工具集成
在任何流行框架中验证你的数据,我们为你处理集成。 -
⏱ 一次编码,到处部署
利用 Kotlin 多平台的优势;只需编写一次验证代码,即可用于前端和后端。 -
⏱ 开箱即用的可测试性
找出如何测试你的验证代码不应该是你的任务之一。你会找到编写良好测试所需的所有工具。
[!注意] 标有 ⏱ 的功能在路线图上。