Files
games/docs/rules/RULES_RUST.md
2026-09-16 09:29:19 +02:00

50 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- file: docs/rules/RULES_RUST.md -->
<!-- version: 4 -->
# Règles Rust générales
## Base
- **RUST-BASE-001** — L'édition Rust est Rust 2024.
- **RUST-BASE-002** — Chaque `lib.rs` et `main.rs` active `missing_docs`, `unreachable_pub` et interdit `unsafe_code`, sauf exception FFI explicitement définie par cette règle.
- **RUST-BASE-003** — Les lints communs sont déclarés au workspace et hérités par les crates ; une crate FFI exceptée peut déclarer localement le même profil avec uniquement le niveau `unsafe_code` ajusté.
- **RUST-BASE-004** — Les blocs `unsafe` et fonctions `unsafe` sont interdits. Lunique exception actuelle est `crates/apps/game-android-entrypoint/src/lib.rs`, autorisé à porter exactement un attribut `#[unsafe(export_name = "SDL_main")]` afin dexposer le symbole exigé par SDL Android. Cette exception nautorise aucun déréférencement de pointeur brut ni autre attribut unsafe.
- **RUST-BASE-005** — Tout fichier Rust possède les en-têtes `// file: ...` et `// version: N`.
- **RUST-DEP-001** — Une dépendance tierce partagée déclare uniquement sa contrainte de version canonique sous `[workspace.dependencies]`, sauf exception normative explicitement documentée.
- **RUST-DEP-002** — Les features d'une dépendance tierce sont activées dans le `Cargo.toml` de la crate qui en a réellement besoin, via `workspace = true`; elles ne sont pas activées globalement au workspace par commodité.
- **RUST-DEP-003** — Une feature plateforme, telle que `use-pkg-config`, reste portée par la crate d'adaptation plateforme concernée et ne contamine pas les crates qui consomment seulement les abstractions du moteur.
## Documentation et API
- **RUST-DOC-001** — Tout élément `pub` ou `pub(crate)` possède une rustdoc utile au point de déclaration.
- **RUST-DOC-002** — Toute réexportation visible depuis le crate-root possède une rustdoc adjacente.
- **RUST-DOC-003** — La façade d'une crate doit permettre de consommer son API sans dépendre des chemins internes de modules.
## Imports et façade
- **RUST-IMPORT-001** — Les éléments partagés appartenant à la crate sont consommés via `crate::Item` après réexport au crate-root.
- **RUST-IMPORT-002** — Les autres crates consomment l'API via `owner_crate::Item` et non via des modules internes.
- **RUST-IMPORT-003** — Aucun `pub mod` n'est utilisé pour exposer indirectement une arborescence interne.
- **RUST-IMPORT-004** — Les glob imports sont interdits.
- **RUST-IMPORT-005** — Les alias de réexport destinés à masquer des collisions de noms sont interdits ; les symboles reçoivent un nom canonique non ambigu.
## Contrôle de flux et erreurs
- **RUST-FLOW-001** — Les retours sont explicites ; le lint Clippy `implicit_return` est refusé.
- **RUST-FLOW-002** — `unwrap()` et `expect()` sont interdits dans le code de production.
- **RUST-FLOW-003** — L'opérateur `?` est interdit ; les chemins d'erreur restent explicites.
- **RUST-FLOW-004** — `panic!` n'est pas utilisé pour une erreur métier récupérable.
## Formatage
- **RUST-FMT-001** — `rustfmt.toml` racine est canonique.
- **RUST-FMT-002** — Lorsquun delta modifie du code Rust, `cargo fmt --all` est exécuté avant la gate afin dappliquer `rustfmt.toml`; les seules modifications produites par cette commande ne nécessitent pas dincrémenter len-tête `// version: N` des fichiers concernés.
- **RUST-FMT-003** — `cargo fmt --all -- --check` vérifie ensuite que létat livré est conforme au formatage canonique.
- **RUST-FMT-004** — La largeur maximale canonique est 160 caractères.
## Tests
- **RUST-TEST-001** — Les tests unitaires restent proches de la crate ou du module testé.
- **RUST-TEST-002** — Les tests d'intégration résident sous `tests/` de la crate concernée.
- **RUST-TEST-003** — Les tests ne rendent pas artificiellement publique une API privée.