map_err | Result | Rust
map_err| Result | Rust
Método map_err no Rust
O método map_err é um utilitário do tipo Result usado para transformar o valor de erro (Err), mantendo o valor de sucesso (Ok) inalterado.
Ele é amplamente utilizado para adaptar erros entre camadas do sistema, como domínio, infraestrutura e web.
Contexto de uso
map_err é aplicado quando:
- Uma função retorna
Result<T, E1> - A função chamadora espera
Result<T, E2> - É necessário converter
E1emE2
Esse cenário é comum ao usar o operador ?.
Assinatura simplificada
fn map_err<F, O>(self, op: F) -> Result<T, O>
where
F: FnOnce(E) -> O
Onde:
Té o tipo de sucessoEé o tipo original do erroOé o novo tipo de erro após a conversão
Funcionamento
- Se o
ResultforOk, o valor passa direto - Se for
Err, a função passada paramap_erré executada - O erro retornado passa a ser do novo tipo
Exemplo simples
let result: Result<i32, &str> = Err("falha");
let mapped = result.map_err(|e| format!("Erro: {}", e));
Resultado:
Err("Erro: falha")
Se fosse Ok(10), nada seria alterado.
Exemplo com validação
fn validate() -> Result<(), String> {
Err("nome inválido".into())
}
Convertendo o erro:
validate().map_err(|e| format!("Erro de validação: {}", e));
O tipo passa de Result<(), String> para Result<(), String> com mensagem transformada.
Uso com o operador ?
O map_err é frequentemente usado antes do ? para alinhar tipos de erro.
fn handler() -> Result<(), actix_web::Error> {
validate().map_err(actix_web::error::ErrorBadRequest)?;
Ok(())
}
Nesse caso:
validate()retornaResult<(), String>map_errconverteStringemactix_web::Error?consegue propagar o erro corretamente
Comparação com map
| Método | Atua sobre |
|---|---|
map | Valor de sucesso (Ok) |
map_err | Valor de erro (Err) |
Exemplo combinado:
result
.map(|v| v * 2)
.map_err(|e| format!("Erro: {}", e));
Vantagens do uso
- Evita
matchverboso - Mantém fluxo funcional
- Facilita uso do operador
? - Permite separação clara entre erros de domínio e de infraestrutura
Leitura mental recomendada
Sempre interprete map_err como:
Se der erro, transforme o erro. Se der sucesso, continue sem alterações.