1use thiserror::Error;
6
7#[derive(Debug, Error)]
9pub enum ErroContext7 {
10 #[error("Nenhuma chave de API válida disponível após {tentativas} tentativas")]
12 RetryEsgotado {
13 tentativas: u32,
15 },
16
17 #[error("Todas as chaves de API falharam por autenticação")]
19 SemChavesApi,
20
21 #[error("Resposta inválida da API: status {status}")]
23 RespostaInvalida {
24 status: u16,
26 },
27
28 #[error("API retornou erro 400: {mensagem}")]
30 ApiRetornou400 {
31 mensagem: String,
33 },
34}
35
36pub type Resultado<T> = std::result::Result<T, ErroContext7>;
40
41#[cfg(test)]
42mod testes {
43 use super::*;
44
45 #[test]
46 fn testa_erro_sem_chaves_api_display() {
47 let erro = ErroContext7::SemChavesApi;
48 let mensagem = erro.to_string();
49 assert!(
50 !mensagem.is_empty(),
51 "SemChavesApi deve ter mensagem não-vazia"
52 );
53 assert!(
54 mensagem.to_lowercase().contains("chave")
55 || mensagem.to_lowercase().contains("api")
56 || mensagem.to_lowercase().contains("auth"),
57 "Mensagem deve mencionar chaves/api/auth, obteve: {mensagem}"
58 );
59 }
60
61 #[test]
62 fn testa_erro_retry_esgotado_contem_numero_de_tentativas() {
63 let erro = ErroContext7::RetryEsgotado { tentativas: 3 };
64 let mensagem = erro.to_string();
65 assert!(
66 mensagem.contains('3'),
67 "Mensagem deve conter número de tentativas (3), obteve: {mensagem}"
68 );
69 }
70
71 #[test]
72 fn testa_erro_resposta_invalida_contem_status() {
73 let erro = ErroContext7::RespostaInvalida { status: 500 };
74 let mensagem = erro.to_string();
75 assert!(
76 mensagem.contains("500"),
77 "Mensagem deve conter código de status, obteve: {mensagem}"
78 );
79 }
80
81 #[test]
82 fn testa_erro_api_400_contem_texto_do_erro() {
83 let erro = ErroContext7::ApiRetornou400 {
84 mensagem: "Parâmetro inválido".to_string(),
85 };
86 let mensagem = erro.to_string();
87 assert!(
88 mensagem.contains("Parâmetro inválido"),
89 "Mensagem deve conter texto do erro, obteve: {mensagem}"
90 );
91 }
92
93 #[test]
94 fn testa_resultado_alias_propaga_erro_context7() {
95 fn falha() -> Resultado<()> {
96 Err(ErroContext7::SemChavesApi)
97 }
98 let resultado: Resultado<()> = falha();
99 assert!(resultado.is_err(), "Resultado deve ser Err");
100 let err = resultado.unwrap_err();
101 assert!(matches!(err, ErroContext7::SemChavesApi));
102 }
103}