pdk_classy/grpc/
status.rs1use std::fmt::Display;
6
7const OK: u32 = 0;
8const CANCELLED: u32 = 1;
9const UNKNOWN: u32 = 2;
10const INVALID_ARGUMENT: u32 = 3;
11const DEADLINE_EXCEEDED: u32 = 4;
12const NOT_FOUND: u32 = 5;
13const ALREADY_EXISTS: u32 = 6;
14const PERMISSION_DENIED: u32 = 7;
15const RESOURCE_EXHAUSTED: u32 = 8;
16const FAILED_PRECONDITION: u32 = 9;
17const ABORTED: u32 = 10;
18const OUT_OF_RANGE: u32 = 11;
19const UNIMPLEMENTED: u32 = 12;
20const INTERNAL: u32 = 13;
21const UNAVAILABLE: u32 = 14;
22const DATA_LOSS: u32 = 15;
23const UNAUTHENTICATED: u32 = 16;
24
25#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
27#[repr(u32)]
28pub enum GrpcStatusCode {
29 Ok = OK,
31
32 Cancelled = CANCELLED,
34
35 Unknown = UNKNOWN,
37
38 InvalidArgument = INVALID_ARGUMENT,
40
41 DeadlineExceeded = DEADLINE_EXCEEDED,
43
44 NotFound = NOT_FOUND,
46
47 AlreadyExists = ALREADY_EXISTS,
49
50 PermissionDenied = PERMISSION_DENIED,
52
53 ResourceExhausted = RESOURCE_EXHAUSTED,
55
56 FailedPrecondition = FAILED_PRECONDITION,
58
59 Aborted = ABORTED,
61
62 OutOfRange = OUT_OF_RANGE,
64
65 Unimplemented = UNIMPLEMENTED,
67
68 Internal = INTERNAL,
70
71 Unavailable = UNAVAILABLE,
73
74 DataLoss = DATA_LOSS,
76
77 Unauthenticated = UNAUTHENTICATED,
79}
80
81impl GrpcStatusCode {
82 pub(super) fn from_u32(code: u32) -> Self {
83 match code {
84 OK => Self::Ok,
85 CANCELLED => Self::Cancelled,
86 UNKNOWN => Self::Unknown,
87 INVALID_ARGUMENT => Self::InvalidArgument,
88 DEADLINE_EXCEEDED => Self::DeadlineExceeded,
89 NOT_FOUND => Self::NotFound,
90 ALREADY_EXISTS => Self::AlreadyExists,
91 PERMISSION_DENIED => Self::PermissionDenied,
92 RESOURCE_EXHAUSTED => Self::ResourceExhausted,
93 FAILED_PRECONDITION => Self::FailedPrecondition,
94 ABORTED => Self::Aborted,
95 OUT_OF_RANGE => Self::OutOfRange,
96 UNIMPLEMENTED => Self::Unimplemented,
97 INTERNAL => Self::Internal,
98 UNAVAILABLE => Self::Unavailable,
99 DATA_LOSS => Self::DataLoss,
100 UNAUTHENTICATED => Self::Unauthenticated,
101 _ => Self::Unknown,
102 }
103 }
104
105 pub fn code(&self) -> u32 {
107 *self as u32
108 }
109
110 pub fn label(&self) -> &'static str {
112 match *self {
113 GrpcStatusCode::Ok => "OK",
114 GrpcStatusCode::Cancelled => "CANCELLED",
115 GrpcStatusCode::Unknown => "UNKNOWN",
116 GrpcStatusCode::InvalidArgument => "INVALID_ARGUMENT",
117 GrpcStatusCode::DeadlineExceeded => "DEADLINE_EXCEEDED",
118 GrpcStatusCode::NotFound => "NOT_FOUND",
119 GrpcStatusCode::AlreadyExists => "ALREADY_EXISTS",
120 GrpcStatusCode::PermissionDenied => "PERMISSION_DENIED",
121 GrpcStatusCode::ResourceExhausted => "RESOURCE_EXHAUSTED",
122 GrpcStatusCode::FailedPrecondition => "FAILED_PRECONDITION",
123 GrpcStatusCode::Aborted => "ABORTED",
124 GrpcStatusCode::OutOfRange => "OUT_OF_RANGE",
125 GrpcStatusCode::Unimplemented => "UNIMPLEMENTED",
126 GrpcStatusCode::Internal => "INTERNAL",
127 GrpcStatusCode::Unavailable => "UNAVAILABLE",
128 GrpcStatusCode::DataLoss => "DATA_LOSS",
129 GrpcStatusCode::Unauthenticated => "UNAUTHENTICATED",
130 }
131 }
132}
133
134#[derive(Debug)]
136pub struct GrpcStatus {
137 code: GrpcStatusCode,
138 message: Option<String>,
139}
140
141impl GrpcStatus {
142 pub fn new(status: GrpcStatusCode, message: Option<String>) -> Self {
144 Self {
145 code: status,
146 message,
147 }
148 }
149
150 pub fn from_code(status: GrpcStatusCode) -> Self {
152 Self {
153 code: status,
154 message: None,
155 }
156 }
157
158 pub fn code(&self) -> GrpcStatusCode {
160 self.code
161 }
162
163 pub fn message(&self) -> Option<&str> {
165 self.message.as_deref()
166 }
167}
168
169impl Display for GrpcStatus {
170 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
171 let code = self.code.label();
172 if let Some(message) = self.message.as_deref() {
173 write!(f, "[{code}] {message}")
174 } else {
175 write!(f, "{code}")
176 }
177 }
178}