#[repr(u32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Code {
Canceled = 1,
Unknown = 2,
InvalidArgument = 3,
DeadlineExceeded = 4,
NotFound = 5,
AlreadyExists = 6,
PermissionDenied = 7,
ResourceExhausted = 8,
FailedPrecondition = 9,
Aborted = 10,
OutOfRange = 11,
Unimplemented = 12,
Internal = 13,
Unavailable = 14,
DataLoss = 15,
Unauthenticated = 16,
}
impl Code {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Code::Canceled => "canceled",
Code::Unknown => "unknown",
Code::InvalidArgument => "invalid_argument",
Code::DeadlineExceeded => "deadline_exceeded",
Code::NotFound => "not_found",
Code::AlreadyExists => "already_exists",
Code::PermissionDenied => "permission_denied",
Code::ResourceExhausted => "resource_exhausted",
Code::FailedPrecondition => "failed_precondition",
Code::Aborted => "aborted",
Code::OutOfRange => "out_of_range",
Code::Unimplemented => "unimplemented",
Code::Internal => "internal",
Code::Unavailable => "unavailable",
Code::DataLoss => "data_loss",
Code::Unauthenticated => "unauthenticated",
}
}
#[must_use]
pub fn from_str(s: &str) -> Option<Self> {
Some(match s {
"canceled" => Code::Canceled,
"unknown" => Code::Unknown,
"invalid_argument" => Code::InvalidArgument,
"deadline_exceeded" => Code::DeadlineExceeded,
"not_found" => Code::NotFound,
"already_exists" => Code::AlreadyExists,
"permission_denied" => Code::PermissionDenied,
"resource_exhausted" => Code::ResourceExhausted,
"failed_precondition" => Code::FailedPrecondition,
"aborted" => Code::Aborted,
"out_of_range" => Code::OutOfRange,
"unimplemented" => Code::Unimplemented,
"internal" => Code::Internal,
"unavailable" => Code::Unavailable,
"data_loss" => Code::DataLoss,
"unauthenticated" => Code::Unauthenticated,
_ => return None,
})
}
#[must_use]
pub fn from_u32(n: u32) -> Option<Self> {
Some(match n {
1 => Code::Canceled,
2 => Code::Unknown,
3 => Code::InvalidArgument,
4 => Code::DeadlineExceeded,
5 => Code::NotFound,
6 => Code::AlreadyExists,
7 => Code::PermissionDenied,
8 => Code::ResourceExhausted,
9 => Code::FailedPrecondition,
10 => Code::Aborted,
11 => Code::OutOfRange,
12 => Code::Unimplemented,
13 => Code::Internal,
14 => Code::Unavailable,
15 => Code::DataLoss,
16 => Code::Unauthenticated,
_ => return None,
})
}
#[must_use]
pub fn http_status(&self) -> u16 {
match self {
Code::Canceled => 499,
Code::Unknown => 500,
Code::InvalidArgument => 400,
Code::DeadlineExceeded => 504,
Code::NotFound => 404,
Code::AlreadyExists => 409,
Code::PermissionDenied => 403,
Code::ResourceExhausted => 429,
Code::FailedPrecondition => 400,
Code::Aborted => 409,
Code::OutOfRange => 400,
Code::Unimplemented => 501,
Code::Internal => 500,
Code::Unavailable => 503,
Code::DataLoss => 500,
Code::Unauthenticated => 401,
}
}
#[must_use]
pub fn from_http_status(status: u16) -> Self {
match status {
400 => Code::Internal,
401 => Code::Unauthenticated,
403 => Code::PermissionDenied,
404 => Code::Unimplemented,
429 | 502 | 503 | 504 => Code::Unavailable,
_ => Code::Unknown,
}
}
#[must_use]
pub fn grpc_code(&self) -> u32 {
*self as u32
}
}
impl core::fmt::Display for Code {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str(self.as_str())
}
}