如何通过Go Struct、PB IDL、Thrift IDL导出CUE文件并生成Schema做数据验证
从Go Struct、PB IDL、Thrift IDL生成CUE Schema并做数据验证
1. 从Go Struct生成CUE Schema
- 用
cue import命令直接转换Go包或单个文件:# 转换整个Go包 cue import go/pkg/path/to/your/package # 转换单个Go文件 cue import ./your_struct.go - 注意点:
- 得确保Go模块已初始化(执行
go mod init),否则CUE没法正确解析依赖 - 嵌套结构体、自定义类型、
json标签这些都会被自动映射成对应的CUE约束,比如json:"name,omitempty"会转为CUE的name?: string
- 得确保Go模块已初始化(执行
2. 从PB IDL生成CUE Schema
- 有两种方式:
- 直接用CUE的protoc插件(推荐):
这种方式不需要生成中间Go代码,能完美支持PB的oneof、map、repeated等特性,生成的CUE会保留PB的字段规则(比如必填字段、默认值)。# 先安装插件 go install cuelang.org/go/cmd/protoc-gen-cue@latest # 从PB IDL生成CUE文件 protoc --cue_out=. your_proto_file.proto - 先通过protoc生成Go代码,再用
cue import导入(和Go Struct的转换方式一致)。
- 直接用CUE的protoc插件(推荐):
3. 从Thrift IDL生成CUE Schema
- 目前CUE没有官方的Thrift直接转换工具,推荐两步走:
- 用Thrift编译器生成Go代码:
thrift --gen go your_thrift_file.thrift - 再用
cue import导入生成的Go代码,转为CUE Schema。
- 用Thrift编译器生成Go代码:
- 注意:Thrift的union、enum等特性会被Go正确映射,CUE会继承这些约束,但要检查生成的CUE是否符合预期——比如Thrift的必填字段在Go中是指针类型,CUE会转为
*T的约束。
4. 用生成的CUE Schema做数据验证
假设生成的CUE Schema文件在./schema目录下,待验证的数据是JSON格式:
- 单文件验证:
- 写一个验证入口文件
validate.cue:package main import "./schema" // 指定待验证数据要符合的结构体 data: schema.YourTargetStruct - 执行验证命令:
如果数据不符合约束,CUE会直接输出错误信息;验证通过则无输出。cue vet data.json validate.cue
- 写一个验证入口文件
- 批量验证大量数据文件:
用shell脚本批量处理:for file in ./data/*.json; do echo "Validating $file..." cue vet "$file" validate.cue done - 扩展自定义约束:如果生成的Schema不够用,可以在CUE中叠加额外规则,比如:
package main import "./schema" data: schema.User & { age: > 18 // 强制年龄大于18 email: =~ "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$" // 邮箱格式校验 }
内容的提问来源于stack exchange,提问作者lin
相关产品推荐
相关产品推荐

