Protobuf / gRPC インスペクター

.proto 定義を読み取り、メッセージ、フィールド型、タグ、gRPC メソッドを一覧表示します。最初のメッセージの構造化 JSON 例を生成します。

ブラウザ内でローカルに実行
このツールの処理はすべてブラウザ内で行われます。KivTools が入力内容をアップロード・保存したり、外部 API に送信したりすることはありません。
.proto 定義Protocol Buffers の定義を貼り付けて、メッセージ・enum・タグ付きフィールド・gRPC メソッドと構造化 JSON の例を一覧表示します。
メッセージ・enum・サービス

ブラウザで .proto 定義を読む手順

Protocol Buffers の定義を貼り付けて「ローカルで検査」を押すと、テキストから読み取れた内容が一覧になります。syntax 行、パッケージ、ファイル順に並んだ各メッセージとそのフィールド、値付きの enum、oneof グループ、メソッド付きの gRPC サービス(ストリーミングはその旨を表示)です。ファイル内の最初のメッセージについては構造化 JSON の例も生成します。コンパイルも送信も行いません。protoc も gRPC 呼び出しもサーバーとの往復もありません。

proto2 と proto3 を同じ方式で、パターンで読むため、得られるのは protoc の解釈ではなく書かれている内容そのものです。ブラウザのネットワークパネルを開いた状態で検査してもリクエストは 1 件も発生せず、概要・カウンター・表はタブ内で組み立てられます。

  1. 定義を入力欄に貼り付けるか、「サンプルを読み込む」で同梱のファイルを使います。User メッセージ 1 件(フィールド 3 個)と Users サービス 1 件(RPC 1 個)で、カウンターは 1 messages / 0 enums / 1 services / 4 fields / RPCs と表示します。
  2. 「ローカルで検査」を押し、プロトコル概要を上から読みます。syntax = "proto3"、パッケージ名、続いて各メッセージとフィールドが記述どおりに並びます(map<string, string> metadata = 4;、optional string idempotency_key = 11;、フィールドオプションも原文のまま)。
  3. 下の表を確認します。フィールド・enum・RPC がそれぞれ 1 行になり、map フィールドは map<string, string> · tag 4、ネストしたメッセージは Wrapper.Inner のようなドット名、ストリーミングメソッドは WatchRequest → stream CaptureResponse と表示されます。
  4. 「コピー」で概要全体をクリップボードへ送れます(ブロックはそのままコピーされることを押下から貼り付けまで確認済み)。「クリア」なら入力欄・概要・カウンター・表をまとめて空にできます。

概要が扱う範囲と、スキャナが意図的に触れない部分

JSON の例は proto3 のマッピングに従う

値の型は proto3 JSON の符号化に合わせます。string フィールドは "example"、int64 と uint64 は文字列 "0"、bytes は "base64-data"、bool は true、repeated は要素 1 個の配列になります。map フィールドはプレースホルダーのキーを 1 つ持つオブジェクトに、メッセージ型のフィールドはネストしたオブジェクトに展開されます。

enum 型のフィールドはその enum で最初に宣言された値を取るため、Currency フィールドは数値ではなく "CURRENCY_UNSPECIFIED" になります。自分自身を参照するメッセージは空オブジェクトで打ち切り、例が無限に膨らまないようにしています。例が付くのはファイル内の最初のメッセージだけなので、見たい型を先頭に置いてください。

外部由来のフィールド型

貼り付けたテキストに宣言がない型(google.protobuf.Timestamp や import 先のメッセージなど)は、例では空オブジェクトになり、パネルに「1 field type(s) come from imported or external definitions」のような注記が付きます。型名自体は概要と表に残ります。

import 先のファイルを取得することはありません。import 行は出力を変えず、ページからリクエストも出ません。例は実スキーマと突き合わせるための構造の下書きであり、そのままサーバーへ送れるペイロードではないと考えてください。

読み取るもの、無視するもの

コメント(// と /* */)は無視し、文字列リテラル内の文字は解釈しないため、[default = "{"] のような既定値も正しく読めます。ネストしたメッセージはドット名を持つ独立した項目になり、親メッセージには直下に宣言されたフィールドだけが並びます。

意図的に外す行もあります。reserved 文、extensions の範囲、option java_package = "com.acme"; のようなファイルオプション、import 行です。これらは概要にも表にもカウンターにも現れず、出力が説明するのはメッセージ・enum・フィールド・RPC だけです。

エラー、限界、サイズの目安

message・enum・service の宣言がないテキストは「No message, enum or service declaration was found in this .proto text.」で停止し、閉じ忘れたブロックは「Unclosed message block: User」のようにブロック名付きで停止します。パターンで読むため protoc 相当の検証はありません。フィールド番号の重複、tag 0、予約範囲 19000–19999 の tag もそのまま一覧に出ます。

見つけた内容をすべて列挙するため、出力はファイルに比例して大きくなります。600 メッセージを含む 305 KB で 12,200 行が約 0.3 秒、3,000 メッセージの 1.5 MB で 60,200 行が Chrome で 2 秒未満でした。表の enum 行は先頭 12 個の値のあとに省略記号を付けますが、概要はすべて出力します。

最近使ったツール: