diff --git a/utils/super/verify.go b/utils/super/verify.go new file mode 100644 index 0000000..4a757ba --- /dev/null +++ b/utils/super/verify.go @@ -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 +} diff --git a/utils/super/verify_example_test.go b/utils/super/verify_example_test.go new file mode 100644 index 0000000..e29a8e0 --- /dev/null +++ b/utils/super/verify_example_test.go @@ -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 +}