bufbuild/protovalidate-go
GitHub: bufbuild/protovalidate-go
protovalidate-go 是 Protobuf 语义验证框架 Protovalidate 的 Go 实现,通过声明式注解和 CEL 表达式在 Protobuf schema 层面实现数据校验,替代 protoc-gen-validate。
Stars: 477 | Forks: 35
[][buf]
# protovalidate-go
[](https://github.com/bufbuild/protovalidate-go/actions/workflows/ci.yaml)
[](https://github.com/bufbuild/protovalidate-go/actions/workflows/conformance.yaml)
[](https://goreportcard.com/report/buf.build/go/protovalidate)
[](https://pkg.go.dev/buf.build/go/protovalidate)
[][buf-mod]
[Protovalidate][protovalidate] 是用于 Protobuf 的语义验证库。它提供了标准注解来验证 message 和 field 上的通用规则,并且能够使用 [CEL][cel] 编写自定义规则。它是 [protoc-gen-validate][protoc-gen-validate] 的下一代替代方案。
使用 Protovalidate,你可以使用标准和自定义验证规则来注解你的 Protobuf message:
```
syntax = "proto3";
package acme.user.v1;
import "buf/validate/validate.proto";
message User {
string id = 1 [(buf.validate.field).string.uuid = true];
uint32 age = 2 [(buf.validate.field).uint32.lte = 150]; // We can only hope.
string email = 3 [(buf.validate.field).string.email = true];
string first_name = 4 [(buf.validate.field).string.max_len = 64];
string last_name = 5 [(buf.validate.field).string.max_len = 64];
option (buf.validate.message).cel = {
id: "first_name_requires_last_name"
message: "last_name must be present if first_name is present"
expression: "!has(this.first_name) || has(this.last_name)"
};
}
```
一旦你将 `protovalidate-go` 添加到你的项目中,验证将是符合 Go 惯用法的:
```
if err = protovalidate.Validate(moneyTransfer); err != nil {
// Handle failure.
}
```
## 安装
要安装该包,请在你的 Go module 中使用 `go get`:
```
go get buf.build/go/protovalidate
```
## 文档
Protovalidate 的详细文档可在 [protovalidate.com][protovalidate] 上获取。
面向 Go 开发者的亮点包括:
* [开发者快速入门][quickstart]
* 针对 [Connect][connect-go] 和 [gRPC][grpc-go] 的详细 RPC 快速入门
* 面向 [protoc-gen-validate 迁移指南][migration-guide] 用户的说明
Go 的 API 文档可在 [pkg.go.dev][pkg-go] 上获取。
### 原生标准验证规则
protovalidate-go 为标准验证规则处理提供了原生支持。它们默认启用,可以通过设置 ValidatorOption `WithDisableNativeRules` 来禁用。
我们继续验证原生规则和 CEL 规则是否会产生相同的结果。`compliance` Makefile target 已被更新为运行两次,
一次启用原生规则,一次启用 CEL 规则。
## 其他语言和仓库
Protovalidate 不仅仅适用于 Go!你可能对其他语言的相关仓库感兴趣:
- [`protovalidate-java`][pv-java] (Java)
- [`protovalidate-python`][pv-python] (Python)
- [`protovalidate-cc`][pv-cc] (C++)
- [`protovalidate-es`][pv-es] (TypeScript 和 JavaScript)
此外,[protovalidate 的核心仓库](https://github.com/bufbuild/protovalidate)提供:
- [Protovalidate 的 Protobuf API][validate-proto]
- 用于 `protovalidate` 实现验收测试的[一致性测试工具][conformance]
## 法律条款
在 [Apache 2 许可证][license] 下提供。
标签:EVTX分析, Go, Protocol Buffers, Python工具, Ruby工具, SOC Prime, 中间件, 开发工具, 数据验证, 日志审计