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.