Você arrumou um emprego em uma biblioteca local, ajudando a organizar a coleção de livros antigos dela. Os estudantes que frequentam a biblioteca vivem caçando citações que lembram só pela metade para citar em seus trabalhos acadêmicos. Em vez de ler manualmente cada livro de capa a capa, você decide criar uma pequena ferramenta para escaneá-los em busca dessas citações parciais.
Busque em arquivos as linhas que correspondem a uma string de busca e retorne todas as linhas correspondentes.
O comando grep do Unix busca, nos arquivos, as linhas que correspondem a uma expressão regular.
Sua tarefa é implementar um comando grep simplificado, que permite buscar por strings fixas.
O comando grep recebe três argumentos:
Em seguida, lê o conteúdo dos arquivos especificados (na ordem especificada), encontra as linhas que contêm a string de busca e, por fim, retorna essas linhas na ordem em que foram encontradas. Ao buscar em vários arquivos, cada linha correspondente é precedida pelo nome do arquivo e dois-pontos (':').
O comando grep aceita as seguintes flags:
-n Adiciona o número da linha e dois-pontos (':') no início de cada linha da saída, colocando o número depois do nome do arquivo (se houver).-l Exibe apenas os nomes dos arquivos que contêm pelo menos uma linha correspondente.-i Faz a correspondência usando uma comparação que ignora maiúsculas e minúsculas.-v Inverte o programa: coleta todas as linhas que não correspondem.-x Busca apenas as linhas em que a string de busca corresponde à linha inteira.Este exercício apresenta a crate anyhow, que facilita o tratamento de tipos de erro arbitrários.
A ideia é garantir que, ao escrever uma aplicação, você não precise se preocupar com quais
erros específicos a função que você chamou está retornando, mas apenas fazer a coisa certa ao propagá-los.
Obs.: na verdade, não é lá muito boa prática usar anyhow ao escrever uma biblioteca, como fazemos aqui; é mais
explícito e mais útil escrever sua própria enum Error quando você escreve uma biblioteca (potencialmente com a ajuda de macros
auxiliares, como as fornecidas pela crate thiserror). No entanto, estamos
fazendo isso de forma intencional e explícita aqui para demonstrar o uso dessa crate.
Para saber mais sobre essa crate, consulte a documentação.
Embora este exercício peça que você implemente apenas as funções mais básicas do grep,
existe de fato um projeto que reimplementa o grep por completo em Rust: o ripgrep.
Se você gostou da ideia de reescrever os programas utilitários básicos em Rust, não deixe de conferir os seguintes projetos:
Crie sua conta no Exercism para aprender e dominar Rust com 99 exercícios e mentoria humana de verdade, tudo de graça.