Валидация 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

Обязательный

Версия синтаксиса proto-файла. На текущий момент поддерживается только версия «proto3»

proto3

—

import "validate/validate.proto"

Обязательный

Подключение библиотеки валидатора protoc-gen-validate (pgv)

—

—

package

Обязательный

Объявление пакета

Строковое значение

—

java_outer_classname

Обязательный

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

Строковое значение

—

Поля сообщения (например, string email = 2 [(validate.rules).string.email = true])

Опциональный

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

Зависит от типа поля и правил валидации

—

Вложенные сообщения (например, Location home = 4 [(validate.rules).message.required = true])

Опциональный

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

Зависит от структуры сообщения

—

Ограничения по .proto схемам:

  • все .proto схемы должны иметь указание опций java_package и java_outer_classname для корректной генерации кода для валидации;

  • опции java_outer_classname среди всех .proto схем должны иметь уникальное значение;

  • для использования конструкций по валидации полей в .proto файлах необходимо добавить import "validate/validate.proto";

  • при обработке импортов в proto-файлах, импортируемый файл ищется в следующем порядке:

    • относительно текущего расположения обрабатываемого файла;

    • относительно корневой директории с кастомными ресурсами профиля.