Un projet d'entrée/sortie : construire un programme en ligne de commande

Ce chapitre est un résumé de toutes les nombreuses compétences que vous avez apprises précédemment et une découverte de quelques fonctionnalités supplémentaires de la bibliothèque standard. Nous allons construire un outil en ligne de commande qui interagit avec des fichiers et les entrées/sorties de la ligne de commande pour mettre en pratique certains concepts Rust dont vous avez maintenant connaissance.

Sa rapiditié, ses fonctionnalités de sécurité, sa sortie binaire unifiée et sa prise en charge de multiples plateformes font de Rust le langage idéal pour créer des outils en ligne de commande, donc pour notre projet, nous allons construire notre version de l'outil en ligne de commande grep (qui signifie globally search a regular expression and print, soit recherche globale et affichage d'une expression régulière). Dans des cas d'usage très simple, grep recherche une chaîne de caractères précise dans un fichier précis. Pour ce faire, grep prend en argument un nom de fichier et une chaîne de caractères. Ensuite, il lit le fichier, trouve les lignes de ce fichier qui contiennent la chaîne de caractères passée en argument, puis affiche ces lignes.

En chemin, nous allons vous montrer comment utiliser dans votre outil en ligne de commande les fonctionnalités des terminaux que de nombreux outils en ligne de commande utilisent. Nous allons lire la valeur d'une variable d'environnement pour permettre à l'utilisateur de configurer le comportement de notre outil. Nous allons aussi afficher des messages d'erreur vers le flux d'erreur standard de la console (stderr) plutôt que vers la sortie standard (stdout), pour, par exemple, que l'utilisateur puisse rediriger la sortie fructueuse vers un fichier, tout en affichant les messages d'erreur à l'écran.

Un membre de la communauté Rust, Andrew Gallant, a déjà créé une version complète et très performante de grep, qu'il a appelée ripgrep. En comparaison, notre version de grep sera plutôt simple, mais ce chapitre va vous donner les connaissances de base dont vous avez besoin pour appréhender un projet réel comme ripgrep.

Notre projet grep va combiner un certain nombre de concepts que vous avez déjà acquis à ce stade :

  • Organiser le code (en utilisant ce que vous avez appris sur les modules au chapitre 7)
  • Utiliser les vecteurs et les chaînes de caractères (les collections du chapitre 8)
  • Gérer les erreurs (chapitre 9)
  • Utiliser les traits et les durées de vie lorsque c'est approprié (chapitre 10)
  • Ecrire les tests (chapitre 11)

Nous vous présenterons aussi brièvement les fermetures, les itérateurs et les objets de trait, que les chapitres 13 et 17 traiteront en détails.