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

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.
A Jornada
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.
As Ferramentas
Então, depois de tudo isso, o que temos?
- Uma ferramenta para ler as informações públicas de tokens JWT;
- Uma ferramenta de alta performance para ler mensagens do EventHub,
- e outra para exportar as mensagens;
- Uma ferramenta normalizadora de dados CSV;
- Uma ferramenta que divide arquivos grandes (incluindo CSV) em arquivos menores;
- Uma ferramenta que busca múltiplos termos dentro de um arquivo de texto e cria um arquivo de saída por termo de busca;
- Uma ferramenta que imita o comando cat do Unix (útil no Windows);
- Uma ferramenta que imita o comando touch do Unix (também útil no Windows);
- Uma ferramenta que gera GUID (uuidv4) no terminal com algumas opções legais;
- Uma ferramenta que converte timestamp unix para formato legível e vice-versa;
🐱 cat
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:
Saída:
1 server_host=localhost^I# Main server$
2 port=8080$
3 $
4 debug=true$
📊 csvn
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"
📡 eh-read
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"
☁️ eh-export
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
🔍 get-lines
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
Cria automaticamente os arquivos results/error.txt
, results/warning.txt
e results/critical.txt
.
🆔 guid
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:
Saída:
🚦 Press Ctrl+C to stop...
550e8400-e29b-41d4-a716-446655440000
(Os valores de GUID serão impressos repetidamente na mesma linha.
🔐 jwt
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..."
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.
✂️ split
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
Cada arquivo de saída recebe os cabeçalhos originais: chega de gerenciamento manual de cabeçalhos!
👆 touch
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
⏰ ts
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:
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. :)