Executando verificação de segurança...
6

Construindo um Servidor de Mock em Rust Baseado em Ficheiros: Uma Jornada de Aprendizagem

Todo o programador tem uma pasta de "projetos paralelos". Alguns são ideias ambiciosas que podem mudar o mundo, enquanto outros nascem de uma necessidade simples e imediata. O meu projeto mais recente, rs-mock-server, encaixa-se perfeitamente na segunda categoria. Eu precisava de um servidor de mock simples para outro projeto, um que não exigisse ficheiros de configuração complexos ou uma curva de aprendizagem acentuada. Também queria aprimorar as minhas competências em Rust. Porque não matar dois coelhos com uma cajadada só?

Esta jornada acabou por ser mais do que apenas construir uma ferramenta; foi um mergulho profundo no coração das funcionalidades mais poderosas (e por vezes temidas) do Rust.

O Problema: Mocks Simples, Sem Complicações

Para o desenvolvimento front-end ou para testar microsserviços, muitas vezes precisamos de uma API falsa que devolva dados previsíveis. Eu queria um servidor que funcionasse diretamente a partir do sistema de ficheiros. Se eu precisasse de um endpoint /users/1, bastaria criar um ficheiro /users/1. A própria estrutura de pastas deveria ser o contrato da API.

Esta ideia tornou-se o conceito central do rs-mock-server: um servidor de mock de configuração zero que mapeia pastas e ficheiros diretamente para rotas de API.


A Curva de Aprendizagem: Mais do que Apenas um Projeto

Construir este servidor foi a desculpa perfeita para pôr as mãos na massa e lidar a sério com os conceitos fundamentais do Rust. Serei o primeiro a admitir que é uma primeira versão com bastante código "horrível", mas isso faz parte do processo de aprendizagem! O objetivo inicial era fazê-lo funcionar; agora, começa a jornada para o melhorar e refatorizar.

🤝 A Fazer Amizade com o Borrow Checker

Ah, o infame Borrow Checker. Como muitos, a minha experiência inicial com ele pareceu uma luta com um compilador teimoso. Mas este projeto forçou-me a ir além de simplesmente fazer os erros desaparecer. Comecei a pensar em termos de propriedade (ownership), tempo de vida (lifetimes) e empréstimos (borrowing). Em vez de passar valores de um lado para o outro à espera do melhor, comecei a planear como os dados fluíam pela aplicação. Foi uma mudança de mentalidade de "lutar contra o compilador" para "trabalhar com a linguagem", e foi gratificante.

🌐 Serviços Web com o Axum

Por cima do Tokio, usei o Axum, uma framework web moderna e ergonómica. O padrão de extratores (extractor pattern) do Axum é brilhante. Torna a extração de dados dos pedidos — seja um parâmetro de rota, uma query ou um cabeçalho — limpa e sem código repetitivo. Construir a lógica de roteamento, que mapeia dinamicamente caminhos de ficheiro como get{id}.json para rotas como /api/users/:id, foi um desafio fascinante que o Axum tornou exequível.


O Resultado: rs-mock-server

Depois de superar estes desafios, nasceu o rs-mock-server. É uma ferramenta leve, rápida e incrivelmente simples que faz exatamente aquilo que me propus a criar.

  • Uma pasta em ./mocks/api/users torna-se a rota /api/users.
  • Um ficheiro chamado get.json dentro dela responde a GET /api/users.
  • Um ficheiro chamado get{id}.json lida com pedidos dinâmicos como GET /api/users/123.

Foi o projeto perfeito — pequeno o suficiente para ser concluído, mas complexo o bastante para me ensinar lições valiosas.


De Ferramenta Privada a Crate Público

Além do código em si, um grande desejo meu era aprender o ciclo de vida completo de um projeto público. Uma coisa é construir uma ferramenta para nós próprios, mas outra é empacotá-la e publicá-la para que todos a possam usar facilmente.

Descobrir como documentar o projeto, configurar os metadados do Cargo.toml e publicá-lo no crates.io foi o passo final e crucial. Ver o meu projeto disponível para qualquer pessoa com um simples comando cargo install foi uma conclusão incrivelmente gratificante para esta jornada de aprendizagem.


Experimente!

Esta jornada foi um lembrete poderoso de que a melhor maneira de aprender é construindo. Não só resolvi um problema prático, como também saí com uma compreensão muito mais profunda do ecossistema Rust.

Se tiver uma necessidade semelhante ou apenas curiosidade, eu adoraria que desse uma vista de olhos.

Claro que não sou muito bom com as palavras, por isso usei um LLM para melhorar este texto, mas ele manteve a alma.

Carregando publicação patrocinada...
2

Que massa, parece ser um problema recorrente ja que eu ja fiz um usando as mesmas ferramentas kkkk mas na minha estrutura utilizei arquivos .json, mas usando rust e axum tbm, como voce lidou com métodos diferentes? (GET, POST, etc)

2

Olá Jeff,

Conforme o nome do arquivo, get.json, post.json, get{id}.json e do diretório que ele se encontra, eu então crio a rota equivalente ao diretório com o handler equivalente ao método.
Você pode entrar no repositório e consultar o README ou até mesmo olha o código, é bem pequeno.