Skip to content

CLI リファレンス

wirespec コンパイラはコマンドラインから実行します:

bash
wirespec <command> [options]

wirespec compile

.wspec ファイルをターゲット言語にコンパイルします。

使い方:

bash
wirespec compile <file> [options]

オプション:

フラグ説明
-o, --output DIR出力ディレクトリ(デフォルト: build
-t, --target c|rustターゲット言語(デフォルト: c)。rust なら .rs を生成
-I, --include-path DIRインポート解決用の検索パス(複数指定可)
--recursive推移的依存もすべてコンパイル
--fuzzlibFuzzer ハーネスも生成(C ターゲットのみ)

例:

単一ファイル:

bash
wirespec compile examples/quic/varint.wspec -o build/

インポート付き:

bash
wirespec compile examples/quic/frames.wspec -I examples/ --recursive -o build/

Rust へのコンパイル:

bash
wirespec compile examples/quic/varint.wspec -t rust -o build/

libFuzzer ハーネス付き:

bash
wirespec compile examples/quic/frames.wspec -t c --fuzz -o build/

出力ファイル:

モジュール quic.frames を C にコンパイルした場合:

ファイル内容
quic_frames.h構造体・enum 宣言、関数プロトタイプ
quic_frames.cパース・シリアライズ・serialized_len の実装
fuzz_quic_frames.clibFuzzer ハーネス(--fuzz 時のみ)

--recursive を指定すると、推移的依存ごとに .h/.c ペアが生成されます。

-t rust の場合は .rs ファイルを 1 つ生成:

ファイル内容
quic_varint.rsRust 構造体、parse / serialize / serialized_len 実装

生成された Rust コードは wirespec-rt クレートの CursorWriterError 型を使います。


wirespec check

コードを生成せず、.wspec ファイルの型チェックだけ行います。CI やエディタ統合に便利です。

使い方:

bash
wirespec check <file>

check コマンドは入力ファイルのみを受け取ります。-I 等のフラグには対応していません。

例:

bash
wirespec check examples/quic/frames.wspec

成功時は ok: <path> を stderr に出力しコード 0 で終了します。失敗時は診断を stderr に出力し、非ゼロで終了します:

error: undefined type 'VarItn'
 --> examples/quic/frames.wspec:34:42
  |
34 | frame QuicFrame = match frame_type: VarItn {
  |                                     ^^^^^^
  = in frame 'QuicFrame'
  hint: did you mean 'VarInt'?

ファズビルドの手順

libFuzzer ハーネスの生成からビルドまで:

bash
# ステップ 1: --fuzz でコンパイル
wirespec compile examples/quic/frames.wspec -t c --fuzz -o build/

# ステップ 2: サニタイザー付きでビルド
cd build
clang -fsanitize=fuzzer,address,undefined \
    -o fuzz_frames \
    quic_frames.c fuzz_quic_frames.c \
    -I../runtime

# ステップ 3: スモークテスト
./fuzz_frames -max_total_time=10

# ステップ 4: シードコーパスで実行
./fuzz_frames fuzz/corpus/quic_frames/ -max_total_time=60

生成されたハーネスは任意の入力に対して _parse() を呼び出し、パースが成功した場合はシリアライズ → 再パースのラウンドトリップで結果が一致することを確認します。


インポートパスの解決

.wspec ファイルに import 文がある場合、コンパイラは以下の順序でモジュールを検索します:

  1. インポート元ファイルのあるディレクトリ
  2. -I / --include-path で指定されたディレクトリ(指定順)

モジュール quic.varint はドット区切りをパス区切りに変換し、quic/varint.wspec(または quic/varint.wspec)として解決されます。

例:

examples/
  quic/
    varint.wspec     # module quic.varint
    frames.wspec     # import quic.varint.VarInt
bash
wirespec compile examples/quic/frames.wspec -I examples/ -o build/

-I examples/ により、quic.varintexamples/quic/varint.wspec に解決されます。


終了コード

コード意味
0成功
1コンパイルエラー(パース、型チェック、コード生成のいずれかで失敗)