Синтаксис proto-файлов В первой строке указываем версию syntax="proto2" или syntax="proto3". Версия proto1 устарела. Отличия между proto2 и proto3 касаются, в основном, работы с опциональными значениями и перечислениями(enums). Также в proto3 появляется тип Any. В конце строки ставим точку с запятой(;). Следующей строкой идет имя пакета `package rarog_db; Далее следует опциональный блок импортов. Импортируемые зависимости расширяют наши возможности путём привнесения функциональности из других пакетов. В двойных кавычках после слова import указывается относительный путь до импортируемого proto-файла. В конце строки ставим точку с запятой(;). Затем описываем сервис. В начале строки указываем ключевое слово service, затем имя сервиса в PascalCase. Далее в фигурных скобках описываем процедуры, которые будет исполнять сервис. Описание процедуры начинается со слова rpc (remote procedure call), имя процедуры в PascalCase, входное сообщение в круглых скобках, затем returns и ответное сообщение в круглых скобках. Инструкция returns обязательна, если ответ не требуется исходя из логики приложения, указывается пустое ответное сообщение. В конце строки ставим точку с запятой(;). Сообщение объявляется словом message, далее идёт имя сообщения в PascalCase. Далее в фигурных скобках следует описание полей сообщения. Поле описывается так: тип_поля имя_поля = номер_поля; repeated - необязательное слово, используется для объявления массива map - необязательное слово, используется для объявления колекции "ключ-значение" optional - необязательное слово, указывает, что поле может содержать либо установленное значение, которое будет передано, либо значение по умолчанию, которое передаваться не будет. тип_поля - тип данных (int32, uint32, int64, uint64, double, float, string, bool). Подробнее тут. Также в качестве типа поля можно использовать сообщение(message) и перечисление (enum). номер_поля - натуральное число

Сообщения могут быть вложены друг в друга. message Root{ message Child { .... } .... } Перечисление объявляется словом enum, название в PascalCase, затем текстовое значение в верхнем регистре, знак "равно" (=) и цифровой код значения(целое число от 0 до бесконечности) enum Status { ACTIVE = 0; CLOSED = 1; }

Если сообщение содержит несколько полей и точно известно, что в один момент времени, заполнено будет только одно из них, можно использовать для экономии памяти конструкцию oneof. message MessWithOneOf { oneof test_oneof { int32 message_num = 3; Status status = 7; } }

Просто удалять поля из proto-файлов настоятельно не рекомендуется для предотвращения конфликтов номеров. Для удаления поля используется слово reserved. Пример использования: message ReservedFields { reserved 1, 3, 5; string value = 2; int64 message_num = 4; }

На этом основные моменты описания proto-файлов подошли к концу. Подробнее можно посмотреть здесь.`