Pular para o conteúdo
Skillpedia
Código em geral280 mil · #117

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

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/rust-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/rust-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
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-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/rust-patterns/SKILL.md -o SKILL.md
Conteú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

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas