フューチャー技術ブログ

Connect用のバリデーションライブラリが最新化していた

そろそろ2年近く経ちますが、2023年7月号のSoftware DesignのgRPCの特集記事の執筆をしました。

その中で、バリデーションツールとしては github.com/bufbuild/protoc-gen-validate の紹介をしていました。ただ、当時の記事では次のような説明をしていました。

なお、protoc-gen-validateは現在のバージョンをV1として互換性をロックした上で、V2を6月からGoから順次公開というアナウンスを最近出しており、カスタムエラーメッセージが出力できるようになったり、CEL(Common Expression Language)ベースでサポートするすべての言語で互換性を持たせたい、としています。Webフロントエンドからのリクエストにも対応できそうなため、将来有望ですが、本特集の原稿の締切り的に詳細が紹介できないので、詳しくは開発元のブログ(注釈5)をウォッチすると良いと思います。

その後、V2が出ることはなかったのですが、装いも新たにprotovalidateという名前でリリースされています。マイグレーションガイドも公開されていますし、その中ではマイグレーションツールも紹介されています。

変更点

  • TypeScript/JavaScript対応が追加
  • インポートするパッケージが変わった。buf.yamlのdepsをbuf.build/bufbuild/protovalidate:v0.10.7に変えて、.protoで読み込むファイルをvalidate/validate.protoからbuf/validate/validate.protoに変える
  • (validate.rules).string.uuid = true(buf.validate.field).string.uuid = trueのようにカッコの中が変わった
  • oneofの制約とかignoredとかdisabledの制約の書き方が変わった
  • 以前のツールだと生成された型にValidate(), ValidateAll()``メソッドが追加されたが、github.com/bufbuild/protovalidate-goパッケージのValidate()`関数を呼び出す形式に変更

追加された機能だと次のような形式でエラーメッセージをわかりやすくできるようになりました。機械的なバリデーションメッセージは理解しにくいですもんね。

{
"fieldPath": "bar",
"ruleId": "foo.bar",
"message": "bar must be greater than 0"
}

あとはCELを使ったバリデーションも良さげです。

message MyMessage {
// The field `value` must be greater than 42.
optional int32 value = 1 [(buf.validate.field).cel = {
id: "my_message.value",
message: "value must be greater than 42",
expression: "this > 42",
}];
}

importとかがちょっと変わったり、パッケージが変わった程度で特に不便になるところはなく、機能は増えているので次回使うことがあれば忘れずにこちらを使おうと思います。