# 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. L’unique exception actuelle est `crates/apps/game-android-entrypoint/src/lib.rs`, autorisé à porter uniquement les attributs `#[unsafe(export_name = "SDL_main")]` , `#[unsafe(export_name = "Java_com_sasedev_games_common_NativeBridge_nativeContractVersion")]` et `#[unsafe(export_name = "Java_com_sasedev_games_common_NativeBridge_nativeRequestPlatformBack")]` nécessaires aux frontières SDL Android et JNI. Cette exception n’autorise aucun déréférencement de pointeur brut, aucun autre attribut unsafe, aucun bloc `unsafe` et aucune fonction `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** — Lorsqu’un delta modifie du code Rust, `cargo fmt --all` est exécuté avant la gate afin d’appliquer `rustfmt.toml`; les seules modifications produites par cette commande ne nécessitent pas d’incrémenter l’en-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.