一个 swift 包,用于创建验证,使用 ResultBuilder
语法。
此库的验证可以通过声明 Validation
类型、使用库提供的内置类型或使您的类型符合 Validatable
协议来构建。
以下示例展示了如何使用为您特定类型定义的验证器。
struct User {
let name: String
let email: String
}
let userValidator = ValidatorOf<User> {
Validator.validate(\.name, using: String.notEmpty())
Validator.validate(\.email) {
String.notEmpty()
String.contains("@")
}
}
try userValidator.validate(User(name: "Blob", email: "blob@example.com")) // success.
try userValidator.validate(User(name: "", email: "blob@example.com")) // throws error.
try userValidator.validate(User(name: "Blob", email: "blob.example.com")) // throws error.
ValidatorOf
是Validator
的类型别名,为了更好的易用性。但是,如果您愿意,以上内容也可以写成Validator<User>
。
您可以使类型符合 Validatable
协议或 AsyncValidatable
协议,这些类型可以验证自身的实例。
通常,您将提供 Validation/body-swift.property-2e4vc
属性。该属性使用 result builder 语法。
extension User: Validatable {
var body: some Validator<Self> {
Validator {
Validator.validate(\.name, using: String.notEmpty())
Validator.validate(\.email) {
String.notEmpty()
String.contains("@")
}
}
}
}
try User(name: "Blob", email: "blob@example.com").validate() // success.
try User(name: "", email: "blob@example.com").validate() // throws error.
try User(name: "Blob", email: "blob.example.com").validate() // throws error.
但是,您也可以实现 Validation/validate(_:)-lqpu
。
enum UserError: Error {
case invalidName
}
extension User: Validatable {
func validate(_ value: User) throws {
guard value.name != "" else {
throw UserError.invalidName
}
}
}
阅读 API 文档 此处。