Tu as décroché un emploi dans une bibliothèque locale, où tu aides à organiser sa collection de vieux livres. Les étudiants qui la fréquentent sont souvent à la recherche de citations dont ils ne se souviennent qu'à moitié, pour les citer dans leurs travaux universitaires. Plutôt que de lire chaque livre manuellement, de la première à la dernière page, tu décides de construire un petit outil qui les parcourt à la recherche de ces extraits de citations.
Recherche dans des fichiers les lignes qui correspondent à une chaîne recherchée et renvoie toutes les lignes correspondantes.
La commande Unix grep recherche dans des fichiers les lignes qui correspondent à une expression régulière.
Ta tâche consiste à implémenter une version simplifiée de la commande grep, qui prend en charge la recherche de chaînes fixes.
La commande grep prend trois arguments :
Elle lit ensuite le contenu des fichiers indiqués (dans l'ordre indiqué), trouve les lignes qui contiennent la chaîne recherchée, puis renvoie enfin ces lignes dans l'ordre dans lequel elles ont été trouvées. Lors d'une recherche dans plusieurs fichiers, chaque ligne correspondante est précédée du nom du fichier et d'un deux-points (':').
La commande grep prend en charge les options suivantes :
-n Fait précéder chaque ligne de la sortie du numéro de ligne et d'un deux-points (':'), en plaçant le numéro après le nom du fichier (s'il est présent).-l Affiche uniquement les noms des fichiers qui contiennent au moins une ligne correspondante.-i Effectue la correspondance sans tenir compte de la casse.-v Inverse le programme : recueille toutes les lignes qui ne correspondent pas.-x Recherche uniquement les lignes pour lesquelles la chaîne recherchée correspond à la ligne entière.Cet exercice présente la crate anyhow, qui simplifie la gestion de types d'erreur quelconques.
Son objectif est de faire en sorte que, lorsque tu écris une application, tu n'aies pas à te soucier
des erreurs particulières que renvoie la fonction que tu appelles, mais que tu fasses simplement ce qu'il faut
quand tu les propages.
N.B. : il est en fait plutôt mal vu d'utiliser anyhow quand on écrit une bibliothèque, comme c'est le cas ici ; il est plus
explicite et plus utile d'écrire ta propre énumération Error quand tu écris une bibliothèque (éventuellement à l'aide de macros
auxiliaires telles que celles fournies par la crate thiserror). Cependant, nous le faisons
ici volontairement et explicitement pour démontrer l'utilisation de cette crate.
Pour en savoir plus sur cette crate, consulte sa documentation.
Cet exercice ne te demande d'implémenter que les fonctions les plus élémentaires de grep,
mais il existe en réalité un projet qui réimplémente entièrement grep en Rust : ripgrep.
Si le concept de réécrire les programmes utilitaires de base en Rust t'a plu, n'hésite pas à jeter un œil aux projets suivants :
Inscris-toi sur Exercism pour apprendre et maîtriser Rust avec 99 exercices, et un vrai mentorat humain, le tout gratuitement.