Arranjaste um emprego numa biblioteca local para ajudar a organizar a coleção de livros antigos. Os estudantes que a frequentam andam muitas vezes à procura de citações vagamente recordadas para citar nos seus trabalhos académicos. Em vez de leres manualmente todos os livros de fio a pavio, decides construir uma pequena ferramenta para os percorrer à procura dessas citações parciais.
Procura em ficheiros as linhas que correspondem a uma string de pesquisa e devolve todas as linhas correspondentes.
O comando grep do Unix procura em ficheiros as linhas que correspondem a uma expressão regular.
A tua tarefa é implementar um comando grep simplificado, que suporta a procura de strings fixas.
O comando grep recebe três argumentos:
De seguida, lê o conteúdo dos ficheiros indicados (pela ordem indicada), encontra as linhas que contêm a string de pesquisa e, por fim, devolve essas linhas pela ordem em que foram encontradas.
Ao procurar em vários ficheiros, cada linha correspondente é precedida pelo nome do ficheiro e por dois pontos (':').
O comando grep suporta as seguintes opções:
-n Acrescenta no início de cada linha da saída o número da linha e dois pontos (':'), colocando o número depois do nome do ficheiro (se existir).-l Mostra apenas os nomes dos ficheiros que contêm pelo menos uma linha correspondente.-i Compara sem distinguir maiúsculas de minúsculas.-v Inverte o programa, ou seja, reúne todas as linhas que não correspondem.-x Procura apenas as linhas em que a string de pesquisa corresponde à linha inteira.Este exercício introduz a crate anyhow, que facilita o tratamento de tipos de erro arbitrários.
A intenção é garantir que, quando escreves uma aplicação, não tenhas de te preocupar com os erros
concretos que a função que chamas devolve, mas apenas fazer o que está certo ao propagá-los.
Nota: na verdade, não é muito boa prática usar anyhow quando se escreve uma biblioteca, como é o
caso aqui; é mais explícito e mais útil escrever o teu próprio enum Error quando escreves uma
biblioteca (potencialmente com a ajuda de macros auxiliares como as fornecidas pela thiserror). No
entanto, estamos intencionalmente e explicitamente a fazê-lo aqui para demonstrar a utilização desta crate.
Para saberes mais sobre esta crate, consulta a sua documentação.
Embora este exercício te peça para implementares apenas as funções mais básicas do grep,
existe na verdade um projeto para reimplementar o grep por completo em Rust: o ripgrep.
Se gostaste da ideia de reescrever os programas utilitários básicos em Rust, não deixes de espreitar os seguintes projetos:
Inscreve-te no Exercism para aprenderes e dominares Rust com 99 exercícios, e mentoria humana real, tudo grátis.