feat: super 包新增 Verify 函数,适用于业务条件校验

This commit is contained in:
kercylan98 2023-07-29 10:03:43 +08:00
parent b730d54499
commit 997bbbe2bc
2 changed files with 69 additions and 0 deletions

40
utils/super/verify.go Normal file
View File

@ -0,0 +1,40 @@
package super
// Verify 对特定表达式进行校验,当表达式不成立时,将执行 handle
func Verify[V any](handle func(V)) *VerifyHandle[V] {
return &VerifyHandle[V]{handle: handle}
}
// VerifyHandle 校验句柄
type VerifyHandle[V any] struct {
handle func(V)
v V
hit bool
}
// PreCase 先决校验用例,当 expression 成立时,将跳过 caseHandle 的执行,直接执行 handle 并返回 false
// - 常用于对前置参数的空指针校验,例如当 a 为 nil 时,不执行 a.B(),而是直接返回 false
func (slf *VerifyHandle[V]) PreCase(expression func() bool, value V, caseHandle func(verify *VerifyHandle[V]) bool) bool {
if expression() {
slf.handle(value)
return false
}
return caseHandle(slf)
}
// Case 校验用例,当 expression 成立时,将忽略后续 Case并将在 Do 时执行 handle返回 false
func (slf *VerifyHandle[V]) Case(expression bool, value V) *VerifyHandle[V] {
if !slf.hit && expression {
slf.v = value
slf.hit = true
}
return slf
}
// Do 执行校验,当校验失败时,将执行 handle并返回 false
func (slf *VerifyHandle[V]) Do() bool {
if slf.hit {
slf.handle(slf.v)
}
return !slf.hit
}

View File

@ -0,0 +1,29 @@
package super_test
import (
"errors"
"fmt"
"github.com/kercylan98/minotaur/utils/super"
)
func ExampleVerify() {
var getId = func() int { return 1 }
var n *super.VerifyHandle[int]
super.Verify(func(err error) {
fmt.Println(err)
}).Case(getId() == 1, errors.New("id can't be 1")).
Do()
super.Verify(func(err error) {
fmt.Println(err)
}).PreCase(func() bool {
return n == nil
}, errors.New("n can't be nil"), func(verify *super.VerifyHandle[error]) bool {
return verify.Do()
})
// Output:
// id can't be 1
// n can't be nil
}