1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
5#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
6pub enum Code {
7 Internal,
9 BadRequest,
11 NotFound,
13 MethodNotAllowed,
15 Gone,
17 Conflict,
19 PayloadTooLarge,
21 RequestTimeout,
23 RateLimited,
25 Unavailable,
27
28 ValidationFailed,
30 Unauthorized,
32 Forbidden,
34 UnprocessableEntity,
36
37 Timeout,
39 Canceled,
41
42 DownstreamError,
44 DownstreamTimeout,
46}
47
48impl Code {
49 pub fn default_status(&self) -> u16 {
51 match self {
52 Code::Internal => 500,
53 Code::BadRequest => 400,
54 Code::NotFound => 404,
55 Code::MethodNotAllowed => 405,
56 Code::Gone => 410,
57 Code::Conflict => 409,
58 Code::PayloadTooLarge => 413,
59 Code::RequestTimeout => 408,
60 Code::RateLimited => 429,
61 Code::Unavailable => 503,
62 Code::ValidationFailed => 400,
63 Code::Unauthorized => 401,
64 Code::Forbidden => 403,
65 Code::UnprocessableEntity => 422,
66 Code::Timeout => 504,
67 Code::Canceled => 499,
68 Code::DownstreamError => 502,
69 Code::DownstreamTimeout => 504,
70 }
71 }
72
73 pub fn is_retryable_default(&self) -> bool {
75 matches!(
76 self,
77 Code::Timeout
78 | Code::DownstreamTimeout
79 | Code::Unavailable
80 | Code::RateLimited
81 | Code::RequestTimeout
82 )
83 }
84
85 pub fn default_message(&self) -> &'static str {
87 match self {
88 Code::Internal => "Internal error",
89 Code::BadRequest => "Bad request",
90 Code::ValidationFailed => "Invalid input",
91 Code::Unauthorized => "Unauthorized",
92 Code::Forbidden => "Forbidden",
93 Code::NotFound => "Not found",
94 Code::Gone => "Resource no longer exists",
95 Code::Conflict => "Conflict",
96 Code::PayloadTooLarge => "Payload too large",
97 Code::UnprocessableEntity => "Unprocessable entity",
98 Code::RateLimited => "Rate limited",
99 Code::RequestTimeout | Code::Timeout | Code::DownstreamTimeout => "Request timed out",
100 Code::Unavailable => "Service unavailable",
101 Code::Canceled => "Request canceled",
102 Code::DownstreamError => "Downstream service error",
103 Code::MethodNotAllowed => "Method not allowed",
104 }
105 }
106}