Aprendi #Rust fazendo ferramentas de linha de comando e foi melhor do que eu esperava! (#cli #rustlang #dev #devlog #programming)

Unleashing the Power of Flags in C# and ReactJS

Overview

Como todo mundo fala que Rust é super rápido e poderoso, sempre quis aprender, mas me faltava motivação… Até que percebi que já tinha um monte de ferramentas CLI, e todas estavam escritas em linguagens diferentes e em repositórios diferentes.

Este Foi o momento em que decidi aprender Rust re-escrevendo todas as minhas ferramentas CLI em Rust, incluindo a criação de clones de ferramentas simples como cat e touch. Que eu gosto, mas elas não existem no Windows.

No começo, fiquei super confuso com o borrow checker do Rust, agora que passou um tempo, está parecendo o inicio. 🤣 Se você está acostumado com linguagens como C# ou Python, o borrow checker pode parecer bem confuso, mas depois de bater a cabeça no teclado por um tempo, isso começa a fazer sentido.

Quando comecei, estava usando IA direto, mas percebi que quanto mais eu usava, menos eu aprendia. Então decidi mudar a forma de usar IA. Em vez de pedir para ela me salvar e consertar o código, comecei a pedir para ela me dizer o que estava errado, por que, e qual era a forma mais idiomática de fazer em Rust.

Foi então que comecei a entender Rust de verdade, e o borrow checker começou a fazer sentido (ou ser menos confuso). Continuei fazendo isso até que todas as ferramentas estivessem prontas, depois comecei a pedir para a IA analisar as ferramentas, encontrar bugs e sugerir melhorias: mas sem alterar o código.

Isso me deu muito insight, e basicamente recriei tudo de novo.

Uma coisa que usei IA descaradamente foi para criar o summary (docstring) dos métodos. Basicamente, toda a documentação foi criada pela IA, e não tenho (muita) vergonha disso. 😂

As ferramentas estão perfeitas? Não, mas estão muito melhores do que eram antes (na minha primeira tentativa) e aprendi muito no processo.

Acho que vale mencionar: Sua experiência com IA vai ser diferente. Esta foi minha experiência e funcionou para mim.

Foi difícil aprender Rust? Como alguém que já sabe programar, e está acostumado com linguagens como C#, Python, Golang e TypeScript, eu diria… não. Não foi difícil, mas tem uma curva de aprendizado pesada até você se acostumar com o borrow checker. Depois disso, fica muito mais fácil.

Então, depois de tudo isso, o que temos?

  1. Uma ferramenta para ler as informações públicas de tokens JWT;
  2. Uma ferramenta de alta performance para ler mensagens do EventHub,
  3. e outra para exportar as mensagens;
  4. Uma ferramenta normalizadora de dados CSV;
  5. Uma ferramenta que divide arquivos grandes (incluindo CSV) em arquivos menores;
  6. Uma ferramenta que busca múltiplos termos dentro de um arquivo de texto e cria um arquivo de saída por termo de busca;
  7. Uma ferramenta que imita o comando cat do Unix (útil no Windows);
  8. Uma ferramenta que imita o comando touch do Unix (também útil no Windows);
  9. Uma ferramenta que gera GUID (uuidv4) no terminal com algumas opções legais;
  10. Uma ferramenta que converte timestamp unix para formato legível e vice-versa;

Imita o clássico comando cat do Unix. Ele concatena arquivos e os exibe com numeração de linhas opcional, visualização de caracteres e recursos de formatação.

Exemplo:

# Show a file with line numbers and visible tabs/line endings
cat -nA config.txt
bash

Saída:

1	server_host=localhost^I# Main server$
2	port=8080$
3	$
4	debug=true$

Odeio lidar com arquivos CSV com dados faltando e ter que escrever um script (ou procurar por algo) para consertar isso, então criei esta ferramenta: Um Normalizador de dados CSV. Esta ferramenta preenche campos vazios com valores padrão que você especifica, deixando seus dados limpos e consistentes.

Exemplo:

# Fill missing names with "Unknown" and missing ages with "0"
csvn --file messy_data.csv --value-map "name=Unknown" --value-map "age=0"
shell

EventHub Reader - conecta ao Azure EventHub, lê mensagens e as armazena localmente com suporte a checkpoint/retomada. Este é seu portal para capturar dados de streaming para análise posterior. Tem performance razoável, e durante meus testes conseguiu ler cerca de 380 mensagens/segundo (provavelmente poderia ser mais rápido em sistemas de arquivos melhores que NTFS).

Exemplo:

# Read from all partitions and export filtered messages to files
eh_read --connection-string "Endpoint=sb://..." --entity-path "events" --read-to-file --dump-filter "ERROR"
shell

Uma das funcionalidades do EventHub Reader mencionado acima é a capacidade de ler mensagens do Eventhub e salvá-las em um banco de dados embarcado local. Depois disso, você precisa de uma forma de exportar essas mensagens do BD para arquivos. Entre a ferramenta EventHub Export! Ela exporta mensagens de bancos de dados locais (criados pelo eh_read) para vários formatos de arquivo.

Você não precisa usar esta ferramenta, já que pode ler as mensagens diretamente para arquivos, mas com esta, você pode ler na velocidade máxima e depois exportar as mensagens.

Exemplo legal:

# Export all temperature sensor messages to JSON with metadata
eh_export --config export-config.json --export-format json --dump-filter "temperature" --include-metadata
shell

Utilitário de busca de texto de alta performance (case insensitive) que extrai linhas contendo padrões específicos. É como grep mas com algumas funcionalidades legais como arquivos de saída separados por termo de busca e processamento paralelo.

Exemplo:

# Search for errors and warnings, output to separate files with 4 workers
get_lines --file server.log --search "error,warning,critical" --output results --workers 4
shell

Cria automaticamente os arquivos results/error.txt, results/warning.txt e results/critical.txt.

Gerador de GUID com algumas funcionalidades extras que acho úteis, como geração contínua em intervalos e integração com a área de transferência ou cópia automática do GUID para a área de transferência.

Exemplo:

# Generate a new GUID every 2 seconds (great for testing)
guid --continuous-generation 2.0
shell

Saída:

🚦 Press Ctrl+C to stop...
550e8400-e29b-41d4-a716-446655440000

(Os valores de GUID serão impressos repetidamente na mesma linha.

Decodificador JWT que extrai e exibe o conteúdo dos tokens sem verificação de assinatura. Útil para debugar problemas de autenticação e entender o que há dentro dos seus tokens.

Exemplo:

# Decode a JWT and copy the user ID to clipboard
jwt --copy-to-clipboard client_id "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
shell

Veja instantaneamente o que há dentro daqueles tokens JWT misteriosos, e copia o valor do claim client_id para a área de transferência, se existir.

Divisor de arquivos que lida tanto com arquivos de texto regulares quanto com arquivos CSV com preservação de cabeçalho.

Exemplo:

# Split a large CSV into 1000-line chunks, keeping headers in each file
split --file huge_dataset.csv --csv-mode --lines-per-file 1000
shell

Cada arquivo de saída recebe os cabeçalhos originais: chega de gerenciamento manual de cabeçalhos!

Minha implementação do comando touch do Unix para atualizar timestamps de arquivos. Cria arquivos se eles não existirem e lida com vários formatos de timestamp.

Exemplo legal:

# Set specific timestamp on multiple files
touch -d "2024-12-25 15:30:00" holiday_file1.txt holiday_file2.txt
shell

Esta ferramenta é um conversor de timestamp bidirecional simples, que converte entre timestamps Unix e datas legíveis automaticamente. Ela detecta o que você fornece e converte para o outro formato. Não é um port perfeito da ferramenta Unix date, mas funciona de forma similar. Não vou mentir, criei isso porque geralmente quero saber o que o valor do campo _ts (do Azure Cosmos Db) significa. Agora é fácil e rápido.

Exemplo legal:

# Convert Unix timestamp to readable date
ts 1703764800
shell

Saída:

🚀 Timestamp Converter v1.0.0
================================================
🔢 Input: 1703764800

UTC Time: 2023-12-28T12:00:00Z
Local Time: 2023-12-28T13:00:00+0100

Aqui está o link para o repositório: https://github.com/brenordv/rusted-toolbox

Se você não tem certeza sobre aprender Rust, espero que este post te ajude a decidir. :)

Traduções: