Pular para conteúdo

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

[dependencies]
clap = { version = "4.0", features = ["derive"] }

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 🧠

  1. Por que o primeiro argumento de std::env::args() é o caminho do próprio programa?
  2. Qual a vantagem de mover a lógica principal para lib.rs em um projeto CLI?
  3. Como o clap ajuda 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! 🌐