https://github.com/fengzhizi715/kvalidation
基于 Kotlin 特性实现的验证框架
https://github.com/fengzhizi715/kvalidation
kotlin kotlin-dsl kotlin-library rxjava2 validation-library
Last synced: 7 days ago
JSON representation
基于 Kotlin 特性实现的验证框架
- Host: GitHub
- URL: https://github.com/fengzhizi715/kvalidation
- Owner: fengzhizi715
- Created: 2019-07-02T14:20:52.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2022-02-19T08:15:06.000Z (about 3 years ago)
- Last Synced: 2025-04-01T10:41:53.983Z (27 days ago)
- Topics: kotlin, kotlin-dsl, kotlin-library, rxjava2, validation-library
- Language: Kotlin
- Homepage:
- Size: 108 KB
- Stars: 17
- Watchers: 2
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# kvalidation
[](http://www.weibo.com/fengzhizi715)
[](https://www.apache.org/licenses/LICENSE-2.0.html)
[](https://jitpack.io/#fengzhizi715/kvalidation)kvalidation 基于 Kotlin 特性实现的验证框架。
# 功能特点:
* DSL 风格
* 支持对象的验证
* 内含多个验证规则,也支持自定义验证规则
* 支持对象中属性的验证
* 支持 RxJava详见:https://www.jianshu.com/p/23f34952f6a0
# 下载:
将它添加到项目的 root build.gradle 中:
```groovy
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
```其余,按需依赖各个模块,其中 core 是必须要依赖的
```groovy
implementation 'com.github.fengzhizi715.kvalidation:core:1.1.0'
``````groovy
implementation 'com.github.fengzhizi715.kvalidation:rxjava2:1.1.0'
``````groovy
implementation 'com.github.fengzhizi715.kvalidation:rxjava3:1.1.0'
```# 使用:
### 使用 Validator
使用 defineValidator() 定义一个 Validator 函数:
```kotlin
fun defineValidator(block: Validator.() -> Unit): Validator {
val v = Validator()
block.invoke(v)
return v
}
```因此,定义一个 Validator 很简单,可以在 block 中添加 ValidateRule。
```kotlin
val validator = defineValidator{this addRule EmailRule()
}val email = "[email protected]"
val result = validator.validate(email,onError = { println(it)})
println(result)
```### Validator 中添加多个校验规则
由于 Validator 是一个 LinkedHashSet,因此可以在 block 中添加多个 ValidateRule。
例如下面的密码校验,使用了两个 ValidateRule:
```kotlin
val validator = defineValidator{this addRule MinLengthRule(6) // 密码长度不能小于6位
this addRule PatternRule("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]+$") // 密码必须数字和字母的组合
}val password = "123456a"
val result = validator.validate(password,onError = { println(it)})
println(result)
```### 支持 RxJava 的使用
由于定义了一个 RxValidator
```kotlin
class RxValidator(private val data: T) : Validator() {fun toObservable(success: (() -> Unit)? = null,error: ((String) -> Unit)? = null) =
Observable.create {
it.onNext(data)
}
.map {
validate(it, onSuccess = { success?.invoke() }, onError = { message -> error?.invoke(message)})
}fun toFlowable(success: (() -> Unit)? = null,error: ((String) -> Unit)? = null) =
Flowable.create ({
it.onNext(data)
}, BackpressureStrategy.BUFFER)
.map {
validate(it, onSuccess = { success?.invoke() }, onError = { message -> error?.invoke(message) })
}fun toSingle(success: (() -> Unit)? = null,error: ((String) -> Unit)? = null) =
Single.create {
it.onSuccess(data)
}
.map {
validate(it, onSuccess = { success?.invoke() }, onError = { message -> error?.invoke(message) })
}fun toMaybe(success: (() -> Unit)? = null,error: ((String) -> Unit)? = null) =
Maybe.create {
it.onSuccess(data)
}
.map {
validate(it, onSuccess = { success?.invoke() }, onError = { message -> error?.invoke(message) })
}
}
```并且定义了一个 defineRxValidator() 和扩展函数 rxValidator()
```kotlin
fun defineRxValidator(data: T, block: RxValidator.() -> Unit): RxValidator {
val v = RxValidator(data)
block.invoke(v)
return v
}fun T.rxValidator(block: RxValidator.() -> Unit): RxValidator {
val v = RxValidator(this)
block.invoke(v)
return v
}
```因此 RxJava 的结合使用变得很简单,下面分别使用两种方式展示了如何结合 RxJava 的使用:
```kotlin
val email = "[email protected]"defineRxValidator(email){ this addRule EmailRule() }
.toObservable( error = { println(it)})
.subscribe{ println(it) }val invalidEmail = "fengzhizi715@126"
invalidEmail.rxValidator { this addRule EmailRule() }
.toObservable( error = { println(it)})
.subscribe{ println(it) }
```### 支持对象中属性的校验
参考上面的代码,在 [kvalidation](https://github.com/fengzhizi715/kvalidation) 中也事先定义了一个 definePropertyValidator()
```kotlin
fun definePropertyValidator(block: PropertyValidator.() -> Unit): PropertyValidator {
val v = PropertyValidator()
block.invoke(v)
return v
}
```因此,在定义一个 PropertyValidator 时,也可以在 block 中添加多个 mustBe()、field()、fields() 方法。
在 field()、fields() 中,还可以添加多个 mustBe() 方法
```kotlin
data class User(val name: String = "tony",val password: String = "abcdefg", val confirmPassword: String = "abcdefg" ,val email:String = "abc#abc.com")val propertyValidator = definePropertyValidator {
mustBe { name.isNotBlank() }
field("password") {
mustBe("password not blank") { password.isNotBlank() }
mustBe("password length range") { password.length in 6..20 }
}fields("password", "confirmPassword") {
mustBe("password confirmPassword same") { password == confirmPassword }
}field("email") {
mustBe("verify email") {email.validate{
this addRule EmailRule()
}
}.errorMessage { "invalid email address" }
}
}fun main() {
val user = User()
val result = propertyValidator.validateAll(user)
println(result)println(propertyValidator.validate(user))
}
```在 email 字段中,mustBe() 里使用了
```kotlin
email.validate{this addRule EmailRule()
}
```它是一个扩展函数:
```kotlin
fun T.validate(block: Validator.() -> Unit): Boolean {
val v = Validator()
block.invoke(v)
return v.validate(this)
}
```它实际上是调用了类的验证,并添加了 EmailRule。
# TODO list:
* 支持 Android
# 联系方式:
Wechat:fengzhizi715
> Java与Android技术栈:每周更新推送原创技术文章,欢迎扫描下方的公众号二维码并关注,期待与您的共同成长和进步。

License
-------Copyright (C) 2018 - present, Tony Shen.
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 athttp://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.