rust-code-review

作者: apollographql

Rust 程式碼審查檢查清單與決策框架,適用於 Rust PR,源自 rust-best-practices。

npx skills add https://github.com/apollographql/rust-best-practices --skill rust-code-review

Rust Code Review

Use this for Rust review work where consistency, safety, and maintainability matter.

Follow ths standards in https://github.com/apollographql/rust-best-practices

Mandatory pre-merge checks

  • Ownership and data flow are intentional.
  • Error handling is explicit and aligns with crate/binary boundaries.
  • Clippy and format quality are clean in touched files.
  • Performance changes are measured before acceptance.
  • Public APIs are documented; docs match runtime behavior.
  • Tests cover intended behavior and error paths.
  • Unsafe or raw-pointer usage is justified and constrained.

Severity matrix

  • P0: unsafe memory bug, panic in recoverable production path, silent data corruption.
  • P1: correctness bug, missing error propagation, invalid API contract.
  • P2: likely performance regression, missing public API docs, flaky tests.
  • P3: style/readability issues, avoidable clone/allocation, unnecessary complexity.

Review skills

Ownership-first coding

  • Prefer borrowing (&T, &mut T) over cloning.
  • Use Clone only when ownership is required or snapshots are explicitly needed.
  • Treat unnecessary clones (especially in loops) as likely regressions.
  • Reject clone on Copy types.

Value vs reference

  • Pass Copy/small POD types by value.
  • Pass large heap-backed or non-trivial objects by reference.
  • Surface ownership intent in function signatures.
  • Use Cow<'_, T> when input may be borrowed or owned.

Fallible control flow

  • Use let PATTERN = EXPR else { ... } for expected early exits.
  • Use if let ... else when divergence needs additional logic.
  • Prefer ? for bubbling errors.
  • Avoid unwrap/expect in production except when impossible-by-design cases are documented.

Allocation and allocation timing

  • Prefer _else APIs to avoid eager allocation (ok_or_else, map_or_else, etc.).
  • Keep iterator chains lazy; allocate only when required by terminal ops.
  • Do not collect and allocate only to throw away data.

Iterator vs loop

  • Use iterator chains for data transformation and composition.
  • Use for for early exits and side-effect-heavy or control-heavy loops.
  • Require readable formatting; avoid long unreadable chains.

Lints and static checks

  • Run and fix warnings from:
    • cargo clippy --all-targets --all-feature --locked -- -D warnings
  • Do not globally silence useful lints.
  • Prefer #[expect(clippy::...)] with rationale instead of #[allow(...)] unless fully justified.

Error discipline

  • Libraries: prefer typed errors (thiserror and #[from] conversions).
  • Binaries: anyhow acceptable, but keep context rich and actionable.
  • Test both success and error behavior.

Tests as behavior docs

  • One behavior per test.
  • One core assertion per test where possible.
  • Names should be descriptive sentence-like statements.
  • Prefer unit tests for internals, integration tests for public behavior.
  • Use snapshot tests only for complex, stable structured outputs.

Documentation and comments

  • Use //////! for API behavior and constraints.
  • Use // for why, safety rationale, platform constraints, and assumptions.
  • Remove stale comments; prefer smaller functions over narrative comments.
  • Link TODOs to issues instead of leaving bare TODO:.

Pointers and concurrency

  • Prefer &/&mut before any heap pointer.
  • Use Arc for cross-thread shared ownership; Rc for single-threaded.
  • Use Box for recursive/heap allocation needs.
  • Review raw pointer usage as unsafe boundaries with explicit invariants.

Quick rejection triggers

  • Unnecessary clones in hot paths.
  • Unjustified allow(clippy::...).
  • Silent recovery from Err that discards root cause.
  • Copying large types by value without a proof of intent.
  • Comments that simply restate what code already expresses.
  • TODOs without ownership/context.

來自 apollographql 的更多技能

apollo-client
apollographql
Apollo Client 是一個全面的 JavaScript 狀態管理庫,讓您能透過 GraphQL 管理本地與遠端資料。4.x 版本帶來了改進的快取機制、更佳的 TypeScript 支援,以及 React 19 相容性。
official
apollo-client
apollographql
全面指南,涵蓋使用 Apollo Client 4.x 建構 React 應用程式,包含查詢、變更、快取及狀態管理。支援多種 React 框架與設定:客戶端應用程式(Vite、CRA)、搭配 React Server Components 的 Next.js App Router、支援串流 SSR 的 React Router 7,以及 TanStack Start。包含用於查詢(useQuery、useLazyQuery)、變更(useMutation)的鉤子,以及基於 Suspense 的模式(useSuspenseQuery、useBackgroundQuery),適用於現代 React 18+ 與 19...
official
apollo-connectors
apollographql
使用@source和@connect指令將REST API整合至GraphQL超級圖譜。提供結構化五步驟流程:研究API結構、使用指令實作綱要、透過rover supergraph compose驗證、執行連接器、測試覆蓋範圍。支援請求配置,包含標頭、請求主體、N+1模式批次處理,以及透過$env注入環境變數。處理回應映射,包含欄位選取、別名、巢狀資料子選取及實體...
official
apollo-federation
apollographql
Apollo Federation 可將多個 GraphQL API(子圖)組合成統一的超級圖表。
official
apollo-ios
apollographql
Apollo iOS 是一個專為 Apple 平台設計的強型別 GraphQL 客戶端。它能從你的 GraphQL 操作與 schema 生成 Swift 型別,並提供 async/await 客戶端、正規化快取(記憶體或 SQLite 支援)、可插拔的攔截器式 HTTP 傳輸(處理查詢、變更與多部分訂閱),以及可選的 WebSocket 傳輸(graphql-transport-ws),可承載任何操作類型。
official
apollo-kotlin
apollographql
Apollo Kotlin 是一個強型別的 GraphQL 客戶端,能從你的 GraphQL 操作和綱要中生成 Kotlin 模型,可用於 Android、JVM 和 Kotlin Multiplatform 專案。
official
apollo-mcp-server
apollographql
透過模型上下文協定將AI代理連接至GraphQL API,內建內省與操作工具。將GraphQL操作暴露為MCP工具;支援三種操作來源:本地檔案、GraphOS Studio集合與持久化查詢清單。提供四種內省工具(introspect、search、validate、execute)用於結構探索與臨時查詢測試;壓縮模式透過簡潔標記減少Token用量。可透過靜態標頭設定認證...
official
apollo-router
apollographql
Apollo Router 是一款以 Rust 編寫的高效能圖形路由器,用於執行 Apollo Federation 2 超級圖。它位於子圖前端,負責查詢規劃、執行與回應組合。
official