TL;DR
https://github.com/mwitkow/go-proto-validators の version 0.1.0 で、
ネストされているEnumに対して is_in_enum:True
を設定するとエラーになる。
version 0.2.0 で解決された様子?だが、うまくいかない。。。
エラーメッセージ
C:\Go\Project\hoge\fuga\foo.pb.go:18:14: undeclared name: Belong_name 2019/09/25 15:33:54 Loading input failed: loading package failed
問題が発生するprotoファイル
item Person { string id = 1 [(validator.field) = {length_gt:0, msg_exists:true, string_not_empty:true}]; string name = 2 [(validator.field) = {length_gt:0, length_lt:50, string_not_empty:true}]; enum Belong { NONE = 0; COMPANY = 1; SCHOOL = 2; OTHER = 3; } Belong belong= 3 [(validator.field) = {msg_exists:true, is_in_enum:true}]; }
原因
version 0.1.0がネストされたEnumに対応していないことが原因の様子。
pb.go
ファイルを生成するとき、Enumは下記のように Name
と Value
の2つの変数に分けて定義される。
var Person_Belong_name = map[int32]string{ 0: "NONE", 1: "COMPANY", 2: "SCHOOL", 3: "OTHER", } var Person_Belong_value = map[string]int32{ "NONE": 0, "COMPANY": 1, "SCHOOL": 2, "OTHER": 3, }
ここで変数名に注目して欲しいのだが、変数名は
{親のクラス名}_{自分のクラス名}_{name|value}
の命名規則に則っている。
go-proto-validators
はこの {親のクラス名}
を追えないようで、
{自分のクラス名}_{name|value}
を探しに行ってしまう。そのため、参照エラーになる。
解決法
ネストしない。
ネストしているEnumを親クラスの外側に出す。
version 0.2.0でこの問題が解決したっぽい。 が、いまいちうまく生成できないのでとりあえずネストしない法でやりすごしている・・・