rust-review について
Rust 開発者向けのコードレビュースキルです。指定されたファイル、モジュール、crate、差分をベストプラクティスに照らして確認し、コードを書き換えずに指摘を返します。
主な機能
- 01指定範囲に沿ったレビュー
- 02ライブラリとアプリの区別
- 03fmt、Clippy、テストの実行
- 04優先度付き指摘と修正コード
- 05正確性、API、テストの確認
活用シーン
- 01Rust の変更差分をレビュー
- 02公開前に crate を確認
- 03エラー処理と API 設計を点検
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ morganlinton/ beautifulrust --skill rust-reviewインストール後、Claude Code で/rust-reviewを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/review-inventory-module/case.yamlplace-files.shprompt.mdevals/review-inventory-module/files/inventory.rsevals/review-inventory-module/graders/01-flags-panics-as-top-priority.md02-flags-rc-refcell-api.md03-flags-borrowed-param-types.md04-flags-error-type.md05-flags-bool-parameter.md06-flags-nondeterministic-output.md07-flags-deny-warnings.md08-findings-cite-locations.md09-findings-cite-named-rules.md10-fixes-shown-as-code.md11-says-what-is-good.md12-code-left-unchanged.md詳細
Rust のレビュー
Rust コードを、rust-best-practices スキルでコードを書くときに使うルールと同じ基準でレビューし、変更すべき点を報告します。出力はレビューであり、書き直しではありません。修正するかどうかは読者が判断します。ユーザーから依頼があった場合に限り、コードを書き直してください。
1. 対象範囲を決める
- 何を読むか。 ユーザーが指定した対象(ファイル、モジュール、クレート、差分)だけをレビューしてください。差分の場合は、変更された行と、それによって問題が生じる箇所をレビューし、ファイル全体は対象にしないでください。
- ライブラリかアプリケーションか。
lib.rs、他のクレートから使われるpubアイテム、公開済みのCargo.tomlがあるかを確認してください。ライブラリのコードには API 設計のルールを厳格に適用します。アプリケーションのコードには、代わりにシンプルさのルールを適用します。具体的な型、anyhowスタイルのエラー、推測に基づく過度な汎用化を避けることが含まれます。レポートの冒頭で、どちらを前提にしたかを明記してください。 - エディションと MSRV。
Cargo.tomlを確認し、プロジェクトで使えない機能を推奨しないようにしてください。
2. 可能であれば、まずツールを実行する
Rust ツールチェーンを利用できる場合は、クレートのルートディレクトリから以下を実行し、その結果をレポートに反映してください。機械的な問題を検出できるため、設計に集中できます。
cargo fmt --check
cargo clippy --all-targets --all-features -- -W clippy::pedantic
cargo test
Clippy の生の出力を貼り付けないでください。繰り返し出る警告は1つの指摘にまとめ、このコードに関係のない pedantic lint は省いてください。ツールを利用できない場合は、その旨をレポートに記載し、コードを読んでレビューしてください。
3. 優先順位に沿って確認する項目
以下の順に確認してください。最初の2つのカテゴリに、実際のバグが潜んでいます。
正確性と健全性
- 未定義動作:
// SAFETY:コメントのないunsafeブロック、列挙型のキャストやライフタイムの延長に使われるtransmute、コンパイラーを黙らせるためのunsafe impl Send/Sync、または安全な呼び出しを通じて未定義動作を引き起こす可能性のある安全な関数(健全性の欠如)。 - 到達可能な経路でのパニック:外部からの入力が到達できる箇所にある
unwrap()、expect()、インデックスアクセス、値がラップするasキャスト、または整数オーバーフロー。 - トレイトの契約:手書きの
Ordと導出されたPartialEqの組み合わせや、Eqと一致しないHash。これらはBTreeMap、HashMap、sort、dedupを気づかないうちに破損させます。 - ロックに関する危険:
.awaitをまたいで保持されるMutexGuardや、呼び出し元に返されるMutexGuard、ロック中に呼び出されるユーザー提供のクロージャー、またはinto_innerで復旧されるポイズン状態のロック。 - パニックを起こす、ブロックする、または失敗する可能性のあるデストラクター。
エラー処理
- 呼び出し元が活用できないエラー:ライブラリの公開エラー型としての
()、String、Box<dyn Error>、Displayとstd::error::Errorを実装していないエラー列挙型、またはライブラリの公開 API におけるanyhow::Error。 - 情報が失われるエラー:
map_err(|_| ...)、source()がない、または失敗したパス、行、値を含まないメッセージ。 - 想定される失敗に対してパニックを使うこと、または制御フローとして
catch_unwindを使うこと。
API 設計(ライブラリでは厳格に確認)
- パラメーター:
&str、&[T]、&Tではなく&String、&Vec<T>、&Box<T>を使うこと、公開シグネチャのboolパラメーター、所有権を受け取ってからクローンすること、または所有権を得るために借用を内部でクローンすること。 - 可視性:非公開にすべき公開フィールド、公開シグネチャに含まれる
Rc、RefCell、Arc、または API に漏れ出すサードパーティー型。 - 標準トレイトの不足:公開型の
Debug、エラーのDisplay、引数なしのnew()と併せたDefault、および独自のfrom_strメソッドではなくFromStr。 - 命名:ゲッターの
get_プレフィックス、コストや所有権と一致しないas_/to_/into_、およびManager/Service/Utilという名前。 - 将来の拡張性:
#[non_exhaustive]にすべき公開列挙型や構造体、または封印すべきトレイト。
慣用性と明瞭さ
- 借用チェッカーを満たすことだけを目的としたクローン。
- チェックしてから
unwrapする処理(if x.is_some() { x.unwrap() })、コンビネーターを使うほうが明瞭なmatch、またはその逆。 +を使った文字列構築、イテレーターのほうが明瞭な手書きループ、またはループにしたほうがよいほど長いイテレーターチェーン。HashMapの反復順序が出力やテストに影響すること。- ソースコードでの
#![deny(warnings)]、理由のない#[allow]、および外部クレートの glob インポート。
ドキュメントとテスト
- ドキュメントのない公開アイテム、および名前を言い換えただけのドキュメント。
- 該当する場合に不足している
# Errors、# Panics、# Safetyセクション。 ?ではなくunwrap()を使うドキュメント例。- テストのないロジック、または定数を言い換えただけのテスト。
rust-best-practices スキルとその references/ フォルダーには、ルール全体とその理由が記載されています。インストールされている場合は、判断に迷う指摘に関連するリファレンスを読んでください。そうでない場合は、上記の概要に従ってください。
4. レポートを作成する
次の構成を使用します。
# Rust review: <what was reviewed>
<One paragraph: what the code does, library or application, overall verdict, and the
single most important thing to fix. Say whether clippy and tests were run.>
## Must fix
### 1. <Short title> (`src/file.rs:42`)
**Rule:** <rule name and source, e.g. "Errors implement std::error::Error (C-GOOD-ERR,
Rust API Guidelines)">
**Problem:** <what is wrong and the concrete consequence, one or two sentences>
**Fix:**
```rust
<the smallest code change that fixes it>
```
## Should fix
### 2. ...
## Consider
### 3. ...
## What's already good
- <2 to 4 specific things the code does well>
指摘事項の分類方法:
- 必ず修正は、バグ、健全性の欠如、到達可能なパニック、または公開後に破壊的変更となる API の誤りを意味します。
- 修正を推奨は、動作はするものの、エラーメッセージの悪化、テストの難しさ、分かりにくい API など、実際のコストを伴うルール違反を意味します。
- 検討は、スタイル、命名、仕上げに関するものです。
各指摘事項のルール:
- 場所を記載します。 各指摘事項に
file:lineの形式で場所を記載します。テストの不足など、単一の場所を特定できない指摘事項にはwhole fileと記載し、出典とともにルールを示します。出典には、C-GETTERのような API Guidelines のコード、Effective Rust の項目番号、M-PANIC-ON-BUGのような Microsoft のガイドラインコード、clippy lint 名、または「Google Rust Style Guide」を使用します。読者がルールを調べられるようにしてください。 - 修正方法をコードで示し、変更する行だけにします。 関数全体を書き換えないでください。
- 同じ指摘はまとめます。 たとえば、parse 結果に対する
unwrap()呼び出しが 8 か所ある場合は、8 件の指摘事項に分けず、行番号を列挙した 1 件の指摘事項にします。 - 意図を尊重します。 文書化された仕様や説明コメントなど、意図的と思われるものは、トレードオフとともに「検討」として記載します。「必ず修正」とはしないでください。
- 適切な分量にします。 短いファイルなら、指摘事項は 5〜10 件で十分です。無理に件数を増やさず、実際のバグをスタイル上の小さな指摘に紛れ込ませないでください。
- 「すでに良い点」は必須です。 著者が維持すべき点を伝えることで、残りの指摘事項にも信頼性が生まれます。
5. lint を提案する
プロジェクトに [lints] テーブルがない場合は、レポートの最後に BeautifulRust の lint 設定を提案します(BeautifulRust リポジトリの lints/lints.toml と lints/clippy.toml、https://github.com/morganlinton/BeautifulRust)。この設定を使うと、上記の機械的な指摘事項の大半を clippy が自動的に検出できます。このレビューで挙げた指摘事項のうち、検出できたはずのものを 2〜3 件示してください。