rust-patterns
Ajuda seu agente a escrever código Rust de forma segura e eficiente. Ele segue as melhores práticas para evitar erros e garantir bom desempenho.
O que ela faz
Este agente ajuda a escrever código na linguagem Rust seguindo as melhores práticas. Ele garante que o código seja seguro, rápido e fácil de manter, focando em como os dados são gerenciados, como erros são tratados e como diferentes partes do código se comunicam.
Quando usar
- ✓Ao escrever código novo em Rust.
- ✓Ao revisar o código de outra pessoa.
- ✓Ao organizar a estrutura de um projeto Rust.
Exemplo do que pedir para a IA
“Como posso garantir que meu código Rust lide com erros de forma segura sem travar o programa?”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
Ele analisa seu código Rust e sugere maneiras de usar os recursos da linguagem, como 'ownership' e 'borrowing', para evitar erros comuns. Também orienta sobre como tratar falhas de forma elegante usando 'Result' e '?' e como organizar o código com 'traits' e 'enums'.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add affaan-m/ECC --skill rust-patternsOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/rust-patterns/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Padrões de Desenvolvimento em Rust
Padrões idiomáticos de Rust e melhores práticas para construir aplicações seguras, performáticas e fáceis de manter.
Quando Usar
- Escrever código Rust novo
- Revisar código Rust
- Refatorar código Rust existente
- Projetar a estrutura de crates e o layout de módulos
Como Funciona
Esta habilidade reforça convenções idiomáticas de Rust em seis áreas principais: propriedade e empréstimo para prevenir corridas de dados em tempo de compilação, Result/? propagação de erros com thiserror para bibliotecas e anyhow para aplicações, enums e correspondência de padrões exaustiva para tornar estados ilegais irrepresentáveis, traits e genéricos para abstração de custo zero, concorrência segura via Arc<Mutex<T>>, canais e async/await, e superfícies de pub mínimas organizadas por domínio.
Princípios Fundamentais
1. Propriedade e Empréstimo
O sistema de propriedade de Rust previne corridas de dados e bugs de memória em tempo de compilação.
// Good: Pass references when you don't need ownership
fn process(data: &[u8]) -> usize {
data.len()
}
// Good: Take ownership only when you need to store or consume
fn store(data: Vec<u8>) -> Record {
Record { payload: data }
}
// Bad: Cloning unnecessarily to avoid borrow checker
fn process_bad(data: &Vec<u8>) -> usize {
let cloned = data.clone(); // Wasteful — just borrow
cloned.len()
}
Use Cow para Propriedade Flexível
use std::borrow::Cow;
fn normalize(input: &str) -> Cow<'_, str> {
if input.contains(' ') {
Cow::Owned(input.replace(' ', "_"))
} else {
Cow::Borrowed(input) // Zero-cost when no mutation needed
}
}
Tratamento de Erros
Use Result e ? — Nunca unwrap() em Produção
// Good: Propagate errors with context
use anyhow::{Context, Result};
fn load_config(path: &str) -> Result<Config> {
let content = std::fs::read_to_string(path)
.with_context(|| format!("failed to read config from {path}"))?;
let config: Config = toml::from_str(&content)
.with_context(|| format!("failed to parse config from {path}"))?;
Ok(config)
}
// Bad: Panics on error
fn load_config_bad(path: &str) -> Config {
let content = std::fs::read_to_string(path).unwrap(); // Panics!
toml::from_str(&content).unwrap()
}
Erros de Biblioteca com thiserror, Erros de Aplicação com anyhow
// Library code: structured, typed errors
use thiserror::Error;
#[derive(Debug, Error)]
pub enum StorageError {
#[error("record not found: {id}")]
NotFound { id: String },
#[error("connection failed")]
Connection(#[from] std::io::Error),
#[error("invalid data: {0}")]
InvalidData(String),
}
// Application code: flexible error handling
use anyhow::{bail, Result};
fn run() -> Result<()> {
let config = load_config("app.toml")?;
if config.workers == 0 {
bail!("worker count must be > 0");
}
Ok(())
}
Combinadores Option em Vez de Correspondência Aninhada
// Good: Combinator chain
fn find_user_email(users: &[User], id: u64) -> Option<String> {
users.iter()
.find(|u| u.id == id)
.map(|u| u.email.clone())
}
// Bad: Deeply nested matching
fn find_user_email_bad(users: &[User], id: u64) -> Option<String> {
match users.iter().find(|u| u.id == id) {
Some(user) => match &user.email {
email => Some(email.clone()),
},
None => None,
}
}
Enums e Correspondência de Padrões
Modele Estados como Enums
// Good: Impossible states are unrepresentable
enum ConnectionState {
Disconnected,
Connecting { attempt: u32 },
Connected { session_id: String },
Failed { reason: String, retries: u32 },
}
fn handle(state: &ConnectionState) {
match state {
ConnectionState::Disconnected => connect(),
ConnectionState::Connecting { attempt } if *attempt > 3 => abort(),
ConnectionState::Connecting { .. } => wait(),
ConnectionState::Connected { session_id } => use_session(session_id),
ConnectionState::Failed { retries, .. } if *retries < 5 => retry(),
ConnectionState::Failed { reason, .. } => log_failure(reason),
}
}
Correspondência Exaustiva — Sem "Catch-All" para Lógica de Negócios
// Bom: Lida com cada variante explicitamente
match command {
Command::Start => start_service(),
Command::Stop => stop_service(),
Command::Restart => restart_service(),
// Adicionar uma nova variante força o tratamento aqui
}
// Ruim: O curinga esconde novas variantes
match command {
…
Perguntas frequentes
O que é 'ownership' em Rust?
É um sistema que garante que o código seja seguro em relação ao uso da memória, definindo quem é o 'dono' dos dados e como eles podem ser compartilhados ou transferidos, evitando erros comuns em outras linguagens.
Qual a diferença entre 'thiserror' e 'anyhow'?
'thiserror' é usado em bibliotecas para criar tipos de erro específicos e claros. 'anyhow' é mais flexível e usado em aplicações para lidar com erros de forma mais simples e contextualizada.
Por que usar 'enums' e 'pattern matching'?
Eles permitem modelar diferentes estados de forma clara e garantir que todas as possibilidades sejam tratadas no código, tornando mais difícil esquecer de lidar com um caso específico.
Detalhes
Descrição original do autor
Idiomatic Rust patterns, ownership, error handling, traits, concurrency, and best practices for building safe, performant applications. Use when writing or reviewing Rust code and ownership, error handling, traits, or concurrency is in question.
repo: affaan-m/ECC
Popularidade
- Estrelas no GitHub
- 280 mil
- Posição no ranking
- #117
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
accessibility
Ajuda seu agente a criar interfaces que todos possam usar. Garante que sites e aplicativos funcionem bem para pessoas com deficiência, como cegos ou com mobilidade reduzida.
affaan-m/ECC
agent-architecture-audit
Faz seu agente verificar se tudo está funcionando corretamente. Ele encontra e conserta problemas em sistemas de IA, garantindo que funcionem como esperado.
affaan-m/ECC
agent-eval
Ajuda seu agente a comparar diferentes ferramentas de programação de IA. Ele mede qual é mais rápido, barato e confiável para realizar tarefas específicas.
affaan-m/ECC
agent-harness-construction
Faz seu agente entender melhor como realizar tarefas. Ele otimiza as ferramentas e instruções que o agente usa para aumentar suas chances de sucesso.
affaan-m/ECC
Skills parecidas
karpathy-guidelines
Ajuda seu agente a escrever código melhor, evitando erros comuns. É útil para garantir que o código seja simples, claro e fácil de verificar.
multica-ai/andrej-karpathy-skills
skill-creator
Permite ao agente criar, modificar e otimizar habilidades. Útil para testar o desempenho de habilidades e melhorar sua precisão.
anthropics/skills
ponytail-debt
Lista todos os atalhos de código ('shortcut:') deixados para depois. Ajuda a ver o que ainda precisa ser corrigido no projeto.
DietrichGebert/ponytail