Um projeto de E/S: construindo um programa de linha de comando
Este capítulo recapitula muitas das habilidades que você aprendeu até agora e explora mais alguns recursos da biblioteca padrão. Vamos construir uma ferramenta de linha de comando que interage com arquivos e com a entrada e saída da linha de comando para praticar alguns dos conceitos de Rust que você já domina.
A velocidade, a segurança, a geração de um único binário e o suporte
multiplataforma de Rust fazem dela uma linguagem ideal para criar ferramentas
de linha de comando. Para o nosso projeto, vamos fazer nossa própria versão da
clássica ferramenta de busca grep (globalmente buscar uma regular
expression e printar). No caso de uso mais simples, grep procura em
um arquivo específico por uma string específica. Para isso, grep recebe como
argumentos um caminho de arquivo e uma string. Em seguida, ele lê o arquivo,
encontra as linhas que contêm a string informada e imprime essas linhas.
Ao longo do caminho, vamos mostrar como fazer nossa ferramenta de linha de
comando usar recursos do terminal que muitas outras ferramentas também usam.
Leremos o valor de uma variável de ambiente para permitir que o usuário
configure o comportamento da ferramenta. Também imprimiremos mensagens de erro
no fluxo de erro padrão (stderr) em vez da saída padrão (stdout) para que,
por exemplo, o usuário possa redirecionar a saída bem-sucedida para um arquivo
e ainda assim continuar vendo as mensagens de erro na tela.
Um membro da comunidade Rust, Andrew Gallant, já criou uma versão completa e
muito rápida do grep, chamada ripgrep. Em comparação, nossa versão será
bem simples, mas este capítulo vai lhe dar parte da base necessária para
entender um projeto do mundo real como o ripgrep.
Nosso projeto grep vai combinar vários conceitos que você aprendeu até aqui:
- Organização de código (Capítulo 7)
- Uso de vetores e strings (Capítulo 8)
- Tratamento de erros (Capítulo 9)
- Uso de traits e lifetimes quando apropriado (Capítulo 10)
- Escrita de testes (Capítulo 11)
Também apresentaremos brevemente closures, iteradores e objetos trait, que os Capítulos 13 e 18 abordarão em detalhe.