swift-validations

CI

一个 swift 包,用于创建验证,使用 ResultBuilder 语法。

其他资源

概述

此库的验证可以通过声明 Validation 类型、使用库提供的内置类型或使您的类型符合 Validatable 协议来构建。

使用 Validator

以下示例展示了如何使用为您特定类型定义的验证器。

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.

ValidatorOfValidator 的类型别名,为了更好的易用性。但是,如果您愿意,以上内容也可以写成 Validator<User>

符合 Validatable 协议

您可以使类型符合 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 文档 此处