Определения Protocol Buffers

Protobuf Formatter

Проверьте самостоятельное определение proto3: дерево, форматированный код и форму JSON. Номера полей сохраняются.

Protobuf Formatter

Исходный код proto3

Результат

    Код остаётся в браузере. Импорты не загружаются, сетевые запросы не отправляются.

    Параметры

    Подмножество proto3 для одного файла. Без импортов, пользовательских опций, компиляции и проверки совместимости. Изменение кода сбрасывает выбор корня.

    Пределы: 100 000 символов UTF-16, 20 000 токенов, 2 000 объявлений, 32 уровня; ожидание до 8 секунд.

    Результат устарел. Экспорт отключён.

    Protobuf Formatter помогает разобраться в плотно записанной схеме перед проверкой изменений. Одних отступов недостаточно: в аккуратном коде тоже встречаются зарезервированные номера и неизвестные типы. Поэтому экспорт становится доступен после проверок поддерживаемых объявлений.

    Дерево показывает исходные имена, номера полей и полные пути типов. JSON Schema описывает форму данных выбранного сообщения. Исходный контракт нужен отдельно: сведения о сервисах, прежних номерах и поведении сгенерированного кода не переносятся в эту проекцию целиком.

    Зачем использовать Protobuf Formatter

    Одинаковые имена не смешиваются

    Protobuf Formatter сохраняет порядок объявлений и показывает полные имена ссылок. OuterA.Item и OuterB.Item остаются разными типами. Рекурсивная связь отображается путём к определению, а не бесконечным раскрытием одного и того же поддерева.

    Исходный документ связан с деревом, в котором вложенные сообщения разных родителей разделены.

    Выберите сообщение для потребителя данных

    В файле может быть несколько сообщений. Выбор корня меняет основной $ref, а общие определения остаются в $defs. Так можно проверить массивы, map и взаимоисключающие контактные поля, не копируя один тип во множество мест результата.

    Два похожих вложенных типа переходят в самостоятельные определения схемы.

    Три особенности работы с определением

    01

    Корень — это объявление message

    По умолчанию выбирается первое сообщение, даже если перед ним есть enum или в файле описаны сервисы. В параметрах доступны полные имена типов. Редактирование исходника сбрасывает выбор, чтобы результат не продолжал ссылаться на удалённое сообщение.

    02

    Сворачивание меняет только просмотр

    Раскрывайте объявления и переходите к коду по номеру строки. Дерево выводит по 50 видимых записей. При копировании структуры экспортируются все объявления, включая свёрнутые и ещё не показанные. Для полного отчёта не нужно вручную раскрывать каждый узел.

    03

    Дождитесь обновления результата

    Автопроверка запускается через 350 мс после изменения. Если её отключить, появятся основная кнопка и сочетание Ctrl/Cmd + Enter. Старый результат сразу блокируется для экспорта. Пример и Очистить сначала показывают замену с числом символов; отмена восстанавливает исходник и результат вместе.

    Что проверяется и что можно увидеть

    Форматировать proto без изменения тегов

    Выберите два или четыре пробела. Комментарии и содержимое строк сохраняются; фигурные скобки и точки с запятой внутри них не считаются структурными разделителями. Имена, номера и порядок полей остаются прежними. Выходной код повторно разбирается, а его дескриптор сравнивается с исходным до разрешения экспорта.

    Номера полей, перечисления и резервы

    Тег должен быть положительным, уникальным в сообщении и находиться вне диапазона 19000–19999. Учитываются и reserved, записанные после полей. Первый элемент enum в proto3 должен иметь значение ноль; числовые псевдонимы требуют allow_alias. Проверяется текущая схема, без предположений о прежних версиях.

    Схемы Protobuf с разрешёнными ссылками

    Дерево объединяет package, message, enum, oneof, service и RPC. Ссылки вперёд, вложенные типы и рекурсивные сообщения разрешаются в пределах файла. Неизвестный тип останавливает генерацию. В дереве остаются исходные имена snake_case, даже когда JSON использует lowerCamelCase.

    Ограниченная проекция в JSON Schema

    Документ 2020-12 использует полные имена в $defs. repeated становится массивом, map — объектом, int64 — строкой. Для oneof допустимо отсутствие всех членов или присутствие одного, но не двух. Обычные одиночные и optional-поля могут отсутствовать; required автоматически не добавляется.

    Поддерживаемый синтаксис и границы проекции

    Один файл с явным proto3
    Начните с syntax = "proto3";. Proto2, Editions, required, group и extensions не поддерживаются. Любой import отклоняется, включая Timestamp и Any. Определения с зависимостями следует проверять с полным набором файлов и путями поиска проекта.
    Только известные стандартные опции
    Принимаются распространённые файловые настройки генерации кода и допустимые применения json_name, packed, deprecated и allow_alias. Пользовательские и агрегатные опции, аннотации валидации и CEL отклоняются. Сохранённая настройка генератора не превращается в бизнес-ограничение JSON Schema.
    Проекция не равна парсеру ProtoJSON
    Она описывает распространённые выходные формы, а не все допустимые входные данные. Null как отсутствие значения, числовые enum и свободная запись чисел строками полностью не моделируются. Шаблон целого числа в строке не проверяет весь 64-битный диапазон; contentEncoding base64 служит аннотацией. Нужные ограничения добавляются в проекте.
    Контракт не исправляется автоматически
    Номера не переназначаются, резервы не удаляются, форматированный код не записывается поверх ввода. Текущий файл не сообщает, какие теги использовались раньше. Компиляция protoc, Buf lint, поиск несовместимых изменений, генерация клиентов и OpenAPI остаются задачами проектных инструментов.
    Ограничения одного запуска
    Допускаются 100 000 символов UTF-16, 20 000 токенов, 2 000 объявлений и 32 уровня вложенности. Размер результата ограничен 1 000 000 символов, время работы worker — восемью секундами. Превышение даёт ошибку: обрезанный исходник не выдаётся за полностью проверенную схему.
    Объявления вместо закодированных сообщений
    Ввод предназначен для .proto, а не двоичных данных, Base64 или TextFormat. Результат — код, структурный отчёт или схема, но не декодированная нагрузка. Обратное преобразование JSON Schema, пакетная обработка файлов, загрузка URL и ссылки с исходным кодом не предусмотрены.

    Вопросы о Protobuf Formatter

    Можно ли начинать номера полей с нуля?

    Нет. Теги сообщений начинаются с 1 и заканчиваются 536870911; диапазон 19000–19999 зарезервирован реализацией. У enum другая роль: первое объявление в proto3 должно иметь значение ноль. Инструмент проверяет эти правила отдельно, чтобы не путать недопустимый тег с обязательным начальным значением перечисления.

    Можно ли пропускать номера полей?

    Да, последовательная нумерация не требуется. После поля 1 может идти поле 20, если нет конфликта или резерва. Форматирование сохраняет промежутки и порядок. Чтобы запретить повторное использование старого номера, внесите его в reserved. Сам по себе пропуск в последовательности не документирует прежнее использование.

    Как объявить optional-поле в proto3?

    Добавьте optional перед типом, чтобы сгенерированный код мог явно отслеживать присутствие значения. Дерево отражает это объявление. В экспортированном JSON Schema могут отсутствовать и обычные одиночные, и optional-поля. Он не описывает сгенерированный метод has и различие между отсутствием значения и значением по умолчанию, возвращённым runtime.

    Почему int64 превращается в строку JSON?

    Обычное число JavaScript не может точно представить все 64-битные целые. Распространённый вывод ProtoJSON использует десятичные строки. Проекция сохраняет эту форму без преобразования в Number. Шаблон проверяет запись, но для точного знакового или беззнакового диапазона нужна дополнительная проверка.

    Почему import не работает при правильном пути?

    Компилятор ищет зависимости относительно настроенных корневых каталогов импорта. У этой панели нет дерева файлов и средства разрешения зависимостей, поэтому любой import явно отклоняется. Проверяйте полный проект через protoc или Buf. Путь не загружается по сети и не игнорируется ради видимости успешной проверки.

    Нашли определение, которое должно поддерживаться?

    Проверьте следующее изменение контракта

    Protobuf Formatter позволяет изучить поддерживаемые объявления и вернуть исходник с проверенной формой JSON в проект. Для окончательной компиляции по-прежнему нужны все зависимости.