🚨

protovalidate を試す

2023/06/12に公開

こんにちは。Enabling team の山本です。

2023年6月2回目は、connect-goprotovalidate についてです。

https://github.com/bufbuild/protovalidate

弊社では、現在、新サービスにおいて gRPC を使った開発を行っています。

今回新たに公開された protovalidate の設定と実装方法について、みていきます。

今回の code は、こちらです。

https://github.com/danny-yamamoto/go-connect-sample

TL;DR

Usage

今回は、name が5文字以上を必須としました。

message GreetRequest {
//  string name = 1;
  string name = 1 [(buf.validate.field).cel = {
    id: "name",
    message: "name must be at least 4 characters.",
    expression: "this.size() > 4"
  }];
}

https://github.com/danny-yamamoto/go-connect-sample/blob/main/greet/v1/greet.proto

rm -rf gen/
buf generate
go run ./cmd/server/main.go

OK

  • request を送信して、validation を確認します。
2023/06/12 02:05:53 validation succeeded
2023/06/12 02:05:53 Request headers:  map[Accept:[*/*] Content-Length:[19] Content-Type:[application/json] User-Agent:[curl/7.74.0]]

NG

2023/06/12 02:06:01 validation failed: validation error:
 - name: name must be at least 4 characters. [name]
2023/06/12 02:06:01 Request headers:  map[Accept:[*/*] Content-Length:[16] Content-Type:[application/json] User-Agent:[curl/7.74.0]]

Summary

Powered by Google's Common Expression Language (CEL), it provides a flexible and efficient foundation for defining and evaluating custom validation rules. The primary goal of protovalidate is to help developers ensure data consistency and integrity across the network without requiring generated code.

公式に書いてある通り、より柔軟な validation が可能になりました。

protovalidate の一番の難点は、CEL だと思います。
慣れていないため、構文を正しく書くのが難しい。
今回、CEL は、ChatGPT を利用して作成しました。

なお、protovalidate は、現在、beta です。
開発の推移を見守りながら、Production に反映させていきたいと思います。

Discussion