rust-best-practices

Normes de codage Rust idiomatiques basées sur le manuel des bonnes pratiques d'Apollo GraphQL. Couvre neuf domaines clés : styles et idiomes de codage, linting avec clippy, optimisation des performances, gestion des erreurs, modèles de test, génériques et dispatch, pattern type state, documentation et sécurité des pointeurs. Met l'accent sur l'emprunt plutôt que le clonage, la gestion des erreurs basée sur Result avec thiserror/anyhow, et le profilage des performances avec les builds release. Inclut des conseils de référence rapide sur les modèles de possession, l'évitement des paniques,...

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

Rust Best Practices

Apply these guidelines when writing or reviewing Rust code. Based on Apollo GraphQL's Rust Best Practices Handbook.

Best Practices Reference

Before reviewing, familiarize yourself with Apollo's Rust best practices. Read ALL relevant chapters in the same turn in parallel. Reference these files when providing feedback:

Quick Reference

Borrowing & Ownership

  • Prefer &T over .clone() unless ownership transfer is required
  • Use &str over String, &[T] over Vec<T> in function parameters
  • Small Copy types (≤24 bytes) can be passed by value
  • Use Cow<'_, T> when ownership is ambiguous

Error Handling

  • Return Result<T, E> for fallible operations; avoid panic! in production
  • Never use unwrap()/expect() outside tests
  • Use thiserror for library errors, anyhow for binaries only
  • Prefer ? operator over match chains for error propagation

Performance

  • Always benchmark with --release flag
  • Run cargo clippy -- -D clippy::perf for performance hints
  • Avoid cloning in loops; use .iter() instead of .into_iter() for Copy types
  • Prefer iterators over manual loops; avoid intermediate .collect() calls

Linting

Run regularly: cargo clippy --all-targets --all-features --locked -- -D warnings

Key lints to watch:

  • redundant_clone - unnecessary cloning
  • large_enum_variant - oversized variants (consider boxing)
  • needless_collect - premature collection

Use #[expect(clippy::lint)] over #[allow(...)] with justification comment.

Testing

  • Name tests descriptively: process_should_return_error_when_input_empty()
  • One assertion per test when possible
  • Use doc tests (///) for public API examples
  • Consider cargo insta for snapshot testing generated output

Generics & Dispatch

  • Prefer generics (static dispatch) for performance-critical code
  • Use dyn Trait only when heterogeneous collections are needed
  • Box at API boundaries, not internally

Type State Pattern

Encode valid states in the type system to catch invalid operations at compile time:

struct Connection<State> { /* ... */ _state: PhantomData<State> }
struct Disconnected;
struct Connected;

impl Connection<Connected> {
    fn send(&self, data: &[u8]) { /* only connected can send */ }
}

Documentation

  • // comments explain why (safety, workarounds, design rationale)
  • /// doc comments explain what and how for public APIs
  • Every TODO needs a linked issue: // TODO(#42): ...
  • Enable #![deny(missing_docs)] for libraries

Plus de skills de apollographql

apollo-federation
apollographql
Apollo Federation permet de composer plusieurs API GraphQL (sous-graphes) en un super
apollo-ios
apollographql
Apollo iOS est un client GraphQL fortement typé pour les plateformes Apple. Il génère des types Swift à partir de vos opérations et schémas GraphQL, et fournit un client async/await, un cache normalisé (en mémoire ou basé sur SQLite), un transport HTTP basé sur des intercepteurs pluggables qui gère les requêtes, mutations et abonnements multipart, ainsi qu'un transport WebSocket optionnel (graphql-transport-ws) pouvant prendre en charge tout type d'opération.
apollo-router
apollographql
Apollo Router est un routeur de graphes haute performance écrit en Rust pour exécuter les supergraphes Apollo Federation 2. Il se place devant vos sous-graphes et gère la planification des requêtes, l'exécution et la composition des réponses.
apollo-router-plugin-creator
apollographql
Créez des plugins Rust natifs pour Apollo Router.
apollo-server
apollographql
Guide complet pour construire des serveurs GraphQL avec Apollo Server 5.x à travers différents frameworks. Couvre la définition de schéma, les résolveurs, la configuration du contexte et la gestion des erreurs avec le support TypeScript. Prend en charge le mode autonome pour le prototypage et les intégrations avec Express, Fastify, Koa et les environnements serverless. Inclut les modèles de résolveurs, l'authentification/autorisation, les plugins, DataLoader pour la prévention N+1 et les techniques d'optimisation des performances. Fournit une documentation de référence pour les sources de données, les erreurs...
graphql-operations
apollographql
Guide des bonnes pratiques pour rédiger des opérations GraphQL efficaces et typées en toute sécurité, et les organiser avec des fragments. Couvre les requêtes, mutations, souscriptions et fragments avec conventions de nommage, syntaxe des variables et utilisation des directives. Met l'accent sur les principes fondamentaux : ne demander que les champs nécessaires, nommer toutes les opérations, utiliser des variables au lieu de valeurs codées en dur, et inclure les champs d'identifiant pour la mise en cache. Recommande de colocaliser les fragments avec les composants et d'utiliser les directives @include / @skip pour les champs conditionnels...
graphql-schema
apollographql
Guide des meilleures pratiques industrielles pour concevoir des schémas GraphQL intuitifs, performants et maintenables. Couvre les principes de conception fondamentaux, notamment l'organisation des types centrée sur le client, les modèles de nullabilité explicite et les stratégies d'évolution rétrocompatibles. Fournit une documentation de référence sur les types, les conventions de nommage, la pagination basée sur curseur, la modélisation des erreurs et les considérations de sécurité. Inclut des modèles pratiques pour les interfaces, les unions, les types d'entrée, les mutations et les stratégies d'identifiant avec des exemples de code...
rover
apollographql
We need to translate the given text from English to French, preserving the name "rover" and other technical terms. The text describes the Apollo Rover CLI. We must not include the name unless it appears in the source text. The source text includes "rover" in "Apollo Rover CLI" and "rover dev command". So we keep "rover" as is. Also preserve "GraphQL", "federation", "supergraph", "GraphOS", "CI/CD", "JSON", etc. Translate the rest naturally. Let's translate: "Apollo Rover CLI for managing GraphQL schemas, federation, and local supergraph development. Publish, fetch, and validate subgraph schemas; compose federated supergraphs locally or via GraphOS Includes schema checking (pre-deploy validation), linting, and introspection from running servers rover dev command starts a local Router with automatic schema composition for development workflows Supports CI/CD patterns with check-before-publish validation and JSON output for scripting Requires..." Translation: "Apollo Rover CLI pour la gestion des schémas Graph