概要
以前に【Go】protoc-gen-validateを含めたprotoファイルでコード出力時にprotoc-gen-go: invalid Go import path
が発生の記事で紹介した通り、protoc-gen-validateはprotoファイルでバリデートの定義を設定できるライブラリです。
gRPCではenumも型として使用できるのですが、今回はenumのバリデートを行う際のメモです。
前提
- 使用したprotoc-gen-validateのバージョンは
v1.0.2
になります。
課題
protoc-gen-validateのドキュメントのEnumsに、設定できるバリデーションが記載されています。
これに従ってdefined_only
の設定を行えば良いかとなると、今度はgRPCのEnumを必須チェックしたいの記事にある通り、null値の場合は自動で「0」値が設定されるので必須かどうかのチェックが上手く行えません。なお、proto3の仕様だとEnumerationsのドキュメントにある通り、値が「0」始まりからでないとenumが設定できません。
対応案
対応として以下の方針が案として挙げられます。
- 「0」の値は
UNKNOWN
として、異常値として扱う。 - 「0」の値は
not_in
の設定でバリデーションで弾く。 - 「0」 以外の値は、
defined_only
でチェック。
設定サンプル
上記方針で、リクエストのenum部分の設定について、以下の通り設定のサンプルを記載します。
enum AuthMethod {
UNKNOWN = 0;
GOOGLE = 1;
EMAIL = 2;
}
message SampleRequest {
AuthMethod authMethod = 1 [(validate.rules).enum = {defined_only: true, not_in: [0]}];
}