Skip to main content

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 E1 em E2

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 sucesso
  • E é o tipo original do erro
  • O é o novo tipo de erro após a conversão

Funcionamento

  • Se o Result for Ok, o valor passa direto
  • Se for Err, a função passada para map_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() retorna Result<(), String>
  • map_err converte String em actix_web::Error
  • ? consegue propagar o erro corretamente

Comparação com map

MétodoAtua sobre
mapValor de sucesso (Ok)
map_errValor de erro (Err)

Exemplo combinado:

result
.map(|v| v * 2)
.map_err(|e| format!("Erro: {}", e));

Vantagens do uso

  • Evita match verboso
  • 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.