Aula 14 - Projeto CLI Profissional 💻
Objetivo
Objetivo: Aplicar os conhecimentos adquiridos para construir uma ferramenta de linha de comando (CLI) funcional, tratando argumentos, lendo arquivos e utilizando o ecossistema de crates do Rust.
1. Tratando Argumentos da Linha de Comando ⌨️
O Rust fornece uma maneira básica de ler argumentos via std::env::args.
use std::env;
fn main() {
let args: Vec<String> = env::args().collect();
// O primeiro argumento é sempre o caminho do binário
let query = &args[1];
let file_path = &args[2];
println!("Buscando por: {}", query);
println!("No arquivo: {}", file_path);
}
2. Manipulando Arquivos 📄
Usamos o módulo std::fs para ler o conteúdo de arquivos de forma segura.
use std::fs;
fn main() {
let conteudo = fs::read_to_string("exemplo.txt")
.expect("Não foi possível ler o arquivo");
println!("Conteúdo:\n{conteudo}");
}
3. Melhorando a CLI com Crates Externas 📦
Para CLIs profissionais, a comunidade Rust utiliza a crate clap (Command Line Argument Parser). Ela gera ajuda automática (--help), valida tipos e muito mais.
Adicionando ao Cargo.toml
Usando o Clap
use clap::Parser;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
/// Nome da pessoa para saudar
#[arg(short, long)]
nome: String,
/// Número de vezes para saudar
#[arg(short, long, default_value_t = 1)]
count: u8,
}
fn main() {
let args = Args::parse();
for _ in 0..args.count {
println!("Olá {}!", args.nome);
}
}
4. Visualização: Arquitetura da Ferramenta 🏗️
graph TD
A["Usuário (Terminal)"] --> B["Parser (Clap)"]
B --> C{Comando?}
C -->|Busca| D["Módulo de Arquivos"]
C -->|Config| E["Módulo de Setup"]
D --> F["Saída Formatada"]
5. Mini-Projeto: Clonando o 'grep' (minigrep) 🔍
Seu desafio é criar uma ferramenta de busca em arquivos:
1. Receba uma "string de busca" e um "caminho de arquivo".
2. Leia o arquivo e retorne apenas as linhas que contêm a string.
3. Adicione uma opção -i (case insensitive) usando o clap.
4. Trate erros de "Arquivo não encontrado" de forma amigável usando Result.
5. Organize o código em main.rs (interface) e lib.rs (lógica de busca).
6. Exercício de Fixação 🧠
- Por que o primeiro argumento de
std::env::args()é o caminho do próprio programa? - Qual a vantagem de mover a lógica principal para
lib.rsem um projeto CLI? - Como o
clapajuda na experiência do usuário final da sua ferramenta?
Próxima Aula: Vamos sair do terminal e ir para a internet com Rust para Web! 🌐