Introduction : Pourquoi la documentation en Rust est bien plus que des commentaires
\n\nL'écosystème Rust est réputé pour sa rigueur et sa fiabilité. Cependant, même le code le plus élégant est inutile sans une documentation de qualité. Au niveau débutant, il suffit d'écrire quelques lignes /// pour les fonctions publiques. Mais lorsque votre projet s'étend à plusieurs crates avec des dizaines de modules, la question des techniques avancées de documentation se pose.
Dans cet article, nous examinerons les outils et astuces qui vous aideront à créer une documentation de niveau enterprise : des tests automatiques d'exemples à la génération de livres et à l'intégration avec CI/CD.
\n\n1. Doctests : une documentation qui ne ment pas
\n\nLa principale « fonctionnalité » de rustdoc est la possibilité d'intégrer des exemples de code exécutables directement dans les commentaires. Ces exemples sont automatiquement compilés et exécutés lors de l'exécution de cargo test. Cela garantit que votre documentation est toujours à jour.
Doctest de base
\n/// Retourne la somme de deux nombres.\n///\n/// # Exemple\n///\n/// ```\n/// let result = my_crate::add(2, 3);\n/// assert_eq!(result, 5);\n/// ```\npub fn add(a: i32, b: i32) -> i32 {\n a + b\n}\n\nAstuces avancées avec doctest
\nVous pouvez masquer les lignes de préparation qui ne doivent pas apparaître dans la documentation à l'aide de # :
/// # Exemple avec initialisation\n///\n/// ```\n/// # use std::collections::HashMap;\n/// let mut map = HashMap::new();\n/// map.insert("key", 42);\n/// assert_eq!(map.get("key"), Some(&42));\n/// ```\n\nVous pouvez également vérifier que le code ne se compile pas (par exemple, pour démontrer des erreurs de compilation) :
\n/// ```compile_fail\n/// let x: i32 = "chaîne"; // Erreur : incompatibilité de types\n/// ```\n\n2. Attributs de documentation : contrôle et métadonnées
\n\nLes attributs #[doc(...)] permettent de configurer finement l'affichage de la documentation.
Masquage d'éléments
\n/// Fonction interne, non destinée à un usage public.\n#[doc(hidden)]\npub fn internal_helper() {}\n\nCatégorisation et recherche
\n/// Groupe d'utilitaires pour le travail réseau.\n#[doc(alias = "net")]\n#[doc(alias = "socket")]\npub mod network {\n // ...\n}\n\nIntégration de documentation provenant d'un autre endroit
\n/// Voir la [documentation du module](index.html) pour des informations générales.\n#[doc(include = "docs/faq.md")]\npub fn complex_function() {}\n\n3. Cross-references et navigation
\n\nRustdoc prend en charge les liens vers d'autres éléments de documentation. Cela crée une structure cohérente, facile à lire.
\n\nLiens vers des fonctions et des types
\n/// Utilisez [`Config::new`] pour créer une instance.\n///\n/// Pour une configuration plus complexe, consultez le module [`config`].\npub struct Config { /* ... */ }\n\nLiens vers des crates externes
\n/// Cette fonction utilise [serde_json] pour la sérialisation.\n///\n/// [serde_json]: https://docs.rs/serde_json\npub fn to_json() {}\n\n4. Outils pour les grands projets : mdBook et documentation de crate
\n\nLorsque cargo doc ne suffit plus, mdBook vient à la rescousse — un utilitaire pour créer des livres à partir de fichiers Markdown. Il est idéal pour rédiger des guides, des tutoriels et de la documentation architecturale.
Démarrage rapide avec mdBook
\n# Installation\ncargo install mdbook\n\n# Création d'un projet\nmdbook init my-book\ncd my-book\nmdbook serve --open\n\nIntégration avec rustdoc
\nVous pouvez intégrer la documentation de mdBook dans cargo doc à l'aide de l'attribut #[doc = include_str!()] :
/// # Architecture\n///\n/// Description détaillée de l'architecture de la bibliothèque :\n///\n#[doc = include_str!("../docs/architecture.md")]\npub mod core {\n // ...\n}\n\n