mcpField
P
port-c-module

port-c-module

github.com/redisearch開発6.2k53 回インストール今日更新
リポジトリ

port-c-module について

CモジュールをRustへ移植する開発者向けのスキルです。コード分析や計画から、FFI統合とテストまでの手順を扱います。

主な機能

  1. 01C API、依存関係、テストの分析
  2. 02モジュール移植計画の作成
  3. 03RustクレートとFFIラッパーの作成
  4. 04RustコードをCコードベースに接続
  5. 05CとRustの統合テスト

活用シーン

  1. 01CモジュールのRust移行計画
  2. 02Cインターフェースを持つRustモジュールの実装
  3. 03移植手順と統合テストの確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/redisearch/redisearch --skill port-c-module

インストール後、Claude Code で/port-c-moduleを入力して読み込まれたか確認します。

詳細

モジュールの移植スキル

C モジュールを Rust に移植するためのガイドです。

引数

移植するモジュール名を引数として指定してください(例:/port-module triemap)。

移植するモジュール:$ARGUMENTS

使用方法

C モジュールを Rust に移植し始める際に、このスキルを使用してください。

手順

1. C コードを分析する

まず、移植する C モジュールを理解してください(src/ 内の $ARGUMENTS.c と $ARGUMENTS.h を探します)。

  • src/ 内の .c ファイルと .h ファイルを読みます
  • ヘッダーファイルで公開されている内容を特定します:
    • コードベースのほかの部分から、このモジュールで定義されているデータ構造の内部フィールドにアクセスできますか?
    • 型は常に値渡し、または参照渡しですか?それとも混在していますか?
    • 対応する Rust の型を FFI 境界を越えて渡せますか?
  • データ構造とそのライフタイムを理解します
  • このモジュールがほかのモジュールからインポートする型と関数を特定します:
    • それらの型が Rust と C のどちらで実装されているかを確認します
    • Rust で実装されている場合、関連する Rust クレートを特定します
    • C で実装されている場合、先に Rust に移植するべきか、あるいは FFI 経由で Rust から C の実装を呼び出すほうがよいかを検討します
  • グローバル状態や Redis モジュールとのやり取りがあるかを確認します
  • tests/ 内でこのモジュールに関連するテストを特定します
2. 移植計画を立てる

モジュールの移植手順と判断事項をまとめた $ARGUMENTS_plan.md ファイルを作成します。 この段階で、移植を容易にするために C コードを変更すべきかどうかを判断します。 例:

  • このモジュールで定義されているデータ構造の内部フィールドを公開しないように、ゲッターとセッターを導入する
  • モジュールをより小さく、扱いやすい部分に分割する
3. Rust クレートを作成する
cd src/redisearch_rs
cargo new $ARGUMENTS --lib
4. 純粋な Rust のロジックを実装する
  • 慣用的な Rust コードを作成します
  • 包括的なテストを追加します
    • すべての C/C++ テストに相当する Rust テストがあることを確認します
  • 公開 API をドキュメントコメントで説明します
  • パフォーマンスが重要なコードには、criterion を使ってマイクロベンチマークを作成します
  • 適切な場合は、プロパティベーステストに proptest を使用します
  • テストコードも、本番コードと同じ注意を払って記述します
5. Rust API と C API を比較する
  • 新しい Rust モジュールの公開 API を、ヘッダーファイルにある C API と照らし合わせて確認します
  • 適切なラッパーやアダプターを追加すれば差異を橋渡しできることを確認します
  • 再設計なしでは差異を橋渡しできないことが判明した場合は、手順 1 に戻ります
6. FFI ラッパーを作成する

新しい Rust モジュールを C コードベースに公開する FFI クレートを作成します:

cd src/redisearch_rs/c_entrypoint
cargo new ${ARGUMENTS}_ffi --lib

FFI クレートでは、以下を行う必要があります:

  • #[unsafe(no_mangle)] pub extern "C" fn 関数を公開します
  • null ポインターとエラーケースを処理します
  • C の型と Rust の型を安全に変換します
  • すべての unsafe ブロックに // SAFETY: コメントを付けます
7. C コードを接続する
  • C ヘッダーファイルとその実装を削除します
  • 古い C ヘッダーが使われていた箇所で、新しい Rust ヘッダーをインポートするように、C コードベースの残りの部分を更新します

Rust FFI クレートの C ヘッダーファイルは自動生成されます。インポートで完全なパスを使う必要はありません。 名前だけを使ってください(例:${ARGUMENTS}_ffi の場合は #include $ARGUMENTS.h;)。

8. 統合をテストする
./build.sh RUN_UNIT_TESTS               # C/C++ unit tests
./build.sh RUN_PYTEST                   # Integration tests

例:適切に移植されたモジュール

高品質な例については、src/redisearch_rs/trie_rs/ を参照してください:

  • 包括的なドキュメントを備えた純粋な Rust の実装
  • 幅広いテストカバレッジ
  • c_entrypoint/trie_ffi/ にある明確な FFI 境界

コメント