Валидация Protobuf#

Рассмотрим в качестве примера proto-файл.

syntax = "proto3";
import "validate/validate.proto";
package protobuf;
option java_outer_classname = "Data";
message Person {
  uint64 id    = 1 [(validate.rules).uint64.gt    = 999];
  string email = 2 [(validate.rules).string.email = true];
  string name  = 3 [(validate.rules).string = {
    pattern:   "[0-9A-Za-z]*$",
    max_bytes: 256,
  }];
  Location home = 4 [(validate.rules).message.required = true];
}
 
message Location {
  double lat = 1 [(validate.rules).double = { gte: -90,  lte: 90 }];
  double lng = 2 [(validate.rules).double = { gte: -180, lte: 180 }];
}

Далее в таблице представлен разбор proto-файла с комментариями.

Часть proto-файла

Комментарии

syntax = "proto3";

Обязательная часть proto-файла, которая говорит о том, что используемый синтаксис это "proto3". На текущий момент поддерживается только эта версия синтаксиса

import "validate/validate.proto";

Обязательная часть, которая подключает библиотеку валидатора protoc-gen-validate(pgv)

package protobuf;

Объявление пакета также является обязательным

option java_outer_classname = "Data";

Обязательный параметр, который отвечает за имя генерируемого java-класса. Следует запомнить значения параметров package и java_outer_classname, так как далее необходимо будет указывать их в конфигурационном файле

string email = 2 [(validate.rules).string.email = true];

Тип, имя параметра, а также его уникальный номер (подробнее об уникальных номерах и возможных типах данных - https://developers.google.com/protocol-buffers/docs/proto3). Помимо этого, в квадратных скобках указываются правила валидации для данного параметра. Синтаксис и примеры по описанию правил валидации можно найти здесь - https://github.com/envoyproxy/protoc-gen-validate#constraint-rules

Location home = 4 [(validate.rules).message.required = true];

Объявление параметра home с типом Location. Мы можем объявлять несколько типов сообщений в одном proto-файле, а также объявлять экземпляры одного типа внутри другого.

message Person {
    ...
}
message Location {
  ...
}