1macro_rules! define_request_code {
21 (
22 $(#[$enum_meta:meta])*
23 pub enum $enum_name:ident {
24 $(
25 $(#[$variant_meta:meta])*
26 $variant:ident = $value:expr
27 ),* $(,)?
28 }
29 ) => {
30 $(#[$enum_meta])*
31 #[repr(i32)]
32 pub enum $enum_name {
33 $(
34 $(#[$variant_meta])*
35 $variant = $value,
36 )*
37 }
38
39 impl From<$enum_name> for i32 {
40 #[inline]
41 fn from(value: $enum_name) -> Self {
42 value as i32
43 }
44 }
45
46 impl From<i32> for $enum_name {
47 #[inline]
48 fn from(value: i32) -> Self {
49 match value {
50 $($value => $enum_name::$variant,)*
51 _ => $enum_name::Unknown,
52 }
53 }
54 }
55
56 impl $enum_name {
57 #[inline]
59 pub const fn to_i32(self) -> i32 {
60 self as i32
61 }
62
63 #[inline]
65 pub const fn is_unknown(&self) -> bool {
66 matches!(self, Self::Unknown)
67 }
68 }
69 };
70}
71
72define_request_code! {
73 #[derive(Debug, Eq, PartialEq, Clone, Copy, Hash)]
74 pub enum RequestCode {
75 SendMessage = 10,
76 PullMessage = 11,
77 QueryMessage = 12,
78 QueryBrokerOffset = 13, QueryConsumerOffset = 14,
80 UpdateConsumerOffset = 15,
81 UpdateAndCreateTopic = 17,
82 UpdateAndCreateTopicList = 18,
83 GetAllTopicConfig = 21,
84 GetTopicConfigList = 22, GetTopicNameList = 23, UpdateBrokerConfig = 25,
87 GetBrokerConfig = 26,
88 TriggerDeleteFiles = 27, GetBrokerRuntimeInfo = 28,
90 SearchOffsetByTimestamp = 29,
91 GetMaxOffset = 30,
92 GetMinOffset = 31,
93 GetEarliestMsgStoreTime = 32,
94 ViewMessageById = 33,
95 HeartBeat = 34,
96 UnregisterClient = 35,
97 ConsumerSendMsgBack = 36,
98 EndTransaction = 37,
99 GetConsumerListByGroup = 38,
100 CheckTransactionState = 39,
101 NotifyConsumerIdsChanged = 40,
102 LockBatchMq = 41,
103 UnlockBatchMq = 42,
104 GetAllConsumerOffset = 43,
105 GetAllDelayOffset = 45,
106 CheckClientConfig = 46,
107 GetClientConfig = 47, UpdateAndCreateAclConfig = 50,
109 DeleteAclConfig = 51,
110 GetBrokerClusterAclInfo = 52,
111 UpdateGlobalWhiteAddrsConfig = 53,
112 GetBrokerClusterAclConfig = 54, GetTimerCheckPoint = 60,
114 GetTimerMetrics = 61,
115
116 PopMessage = 200050,
117 AckMessage = 200051,
118 BatchAckMessage = 200151,
119 PeekMessage = 200052,
120 ChangeMessageInvisibleTime = 200053,
121 Notification = 200054,
122 PollingInfo = 200055,
123
124 PutKvConfig = 100,
125 GetKvConfig = 101,
126 DeleteKvConfig = 102,
127 RegisterBroker = 103,
128 UnregisterBroker = 104,
129 GetRouteinfoByTopic = 105,
130 GetBrokerClusterInfo = 106,
131 UpdateAndCreateSubscriptionGroup = 200,
132 GetAllSubscriptionGroupConfig = 201,
133 GetTopicStatsInfo = 202,
134 GetConsumerConnectionList = 203,
135 GetProducerConnectionList = 204,
136 WipeWritePermOfBroker = 205,
137 GetAllTopicListFromNameserver = 206,
138 DeleteSubscriptionGroup = 207,
139 GetConsumeStats = 208,
140
141 SuspendConsumer = 209, ResumeConsumer = 210, ResetConsumerOffsetInConsumer = 211, ResetConsumerOffsetInBroker = 212, AdjustConsumerThreadPool = 213, WhoConsumeTheMessage = 214, DeleteTopicInBroker = 215,
149 DeleteTopicInNamesrv = 216,
150 RegisterTopicInNamesrv = 217,
151 GetKvlistByNamespace = 219,
152 ResetConsumerClientOffset = 220,
153 GetConsumerStatusFromClient = 221,
154 InvokeBrokerToResetOffset = 222,
155 InvokeBrokerToGetConsumerStatus = 223,
156
157 QueryTopicConsumeByWho = 300,
158 GetTopicsByCluster = 224,
159 QueryTopicsByConsumer = 343,
160 QuerySubscriptionByConsumer = 345,
161
162 RegisterFilterServer = 301, RegisterMessageFilterClass = 302, QueryConsumeTimeSpan = 303,
166 GetSystemTopicListFromNs = 304,
167 GetSystemTopicListFromBroker = 305,
168 CleanExpiredConsumequeue = 306,
169 GetConsumerRunningInfo = 307,
170 QueryCorrectionOffset = 308,
171 ConsumeMessageDirectly = 309,
172 SendMessageV2 = 310,
173 GetUnitTopicList = 311,
174 GetHasUnitSubTopicList = 312,
175 GetHasUnitSubUnunitTopicList = 313,
176 CloneGroupOffset = 314,
177 ViewBrokerStatsData = 315,
178 CleanUnusedTopic = 316,
179 GetBrokerConsumeStats = 317,
180 UpdateNamesrvConfig = 318,
181 GetNamesrvConfig = 319,
182 SendBatchMessage = 320,
183 QueryConsumeQueue = 321,
184 QueryDataVersion = 322,
185 ResumeCheckHalfMessage = 323,
186 SendReplyMessage = 324,
187 SendReplyMessageV2 = 325,
188 PushReplyMessageToClient = 326,
189 AddWritePermOfBroker = 327,
190 GetTopicConfig = 351,
191 GetSubscriptionGroupConfig = 352,
192 UpdateAndGetGroupForbidden = 353,
193 LitePullMessage = 361,
194
195 QueryAssignment = 400,
196 SetMessageRequestMode = 401,
197 GetAllMessageRequestMode = 402,
198 UpdateAndCreateStaticTopic = 513,
199 GetBrokerMemberGroup = 901,
200 AddBroker = 902,
201 RemoveBroker = 903,
202 BrokerHeartbeat = 904,
203 NotifyMinBrokerIdChange = 905,
204 ExchangeBrokerHaInfo = 906,
205 GetBrokerHaStatus = 907,
206 ResetMasterFlushOffset = 908,
207 GetAllProducerInfo = 328,
208 DeleteExpiredCommitlog = 329,
209
210 UpdateColdDataFlowCtrConfig = 2001,
211 RemoveColdDataFlowCtrConfig = 2002,
212 GetColdDataFlowCtrInfo = 2003,
213 SetCommitlogReadMode = 2004,
214
215 ControllerAlterSyncStateSet = 1001,
217 ControllerElectMaster = 1002,
218 ControllerRegisterBroker = 1003,
219 ControllerGetReplicaInfo = 1004,
220 ControllerGetMetadataInfo = 1005,
221 ControllerGetSyncStateData = 1006,
222 GetBrokerEpochCache = 1007,
223 NotifyBrokerRoleChanged = 1008,
224 UpdateControllerConfig = 1009,
225 GetControllerConfig = 1010,
226
227 CleanBrokerData = 1011,
228 ControllerGetNextBrokerId = 1012,
229 ControllerApplyBrokerId = 1013,
230 BrokerCloseChannelRequest = 1014,
231 CheckNotActiveBrokerRequest = 1015,
232 GetBrokerLiveInfoRequest = 1016,
233 GetSyncStateDataRequest = 1017,
234 RaftBrokerHeartBeatEventRequest = 1018,
235
236 AuthCreateUser = 3001,
238 AuthUpdateUser = 3002,
239 AuthDeleteUser = 3003,
240 AuthGetUser = 3004,
241 AuthListUser = 3005,
242 AuthCreateAcl = 3006,
243 AuthUpdateAcl = 3007,
244 AuthDeleteAcl = 3008,
245 AuthGetAcl = 3009,
246 AuthListAcl = 3010,
247
248 Unknown = -9999999,
249 }
250}
251
252#[cfg(test)]
253mod tests {
254 use super::*;
255
256 #[test]
257 fn test_request_code_to_i32() {
258 assert_eq!(RequestCode::SendMessage.to_i32(), 10);
259 assert_eq!(RequestCode::PullMessage.to_i32(), 11);
260 assert_eq!(RequestCode::HeartBeat.to_i32(), 34);
261 assert_eq!(RequestCode::PopMessage.to_i32(), 200050);
262 assert_eq!(RequestCode::ControllerAlterSyncStateSet.to_i32(), 1001);
263 assert_eq!(RequestCode::AuthCreateUser.to_i32(), 3001);
264 assert_eq!(RequestCode::Unknown.to_i32(), -9999999);
265 }
266
267 #[test]
268 fn test_i32_to_request_code() {
269 assert_eq!(RequestCode::from(10), RequestCode::SendMessage);
270 assert_eq!(RequestCode::from(11), RequestCode::PullMessage);
271 assert_eq!(RequestCode::from(34), RequestCode::HeartBeat);
272 assert_eq!(RequestCode::from(200050), RequestCode::PopMessage);
273 assert_eq!(
274 RequestCode::from(1001),
275 RequestCode::ControllerAlterSyncStateSet
276 );
277 assert_eq!(RequestCode::from(3001), RequestCode::AuthCreateUser);
278 assert_eq!(RequestCode::from(-9999999), RequestCode::Unknown);
279 }
280
281 #[test]
282 fn test_unknown_code_conversion() {
283 assert_eq!(RequestCode::from(99999), RequestCode::Unknown);
285 assert_eq!(RequestCode::from(-1), RequestCode::Unknown);
286 assert_eq!(RequestCode::from(0), RequestCode::Unknown);
287 assert_eq!(RequestCode::from(999), RequestCode::Unknown);
288 }
289
290 #[test]
291 fn test_is_unknown() {
292 assert!(RequestCode::Unknown.is_unknown());
293 assert!(!RequestCode::SendMessage.is_unknown());
294 assert!(!RequestCode::HeartBeat.is_unknown());
295 assert!(!RequestCode::PopMessage.is_unknown());
296
297 let unknown_code = RequestCode::from(12345);
299 assert!(unknown_code.is_unknown());
300 }
301
302 #[test]
303 fn test_request_code_from_trait() {
304 let code: i32 = RequestCode::SendMessage.into();
305 assert_eq!(code, 10);
306
307 let code: i32 = RequestCode::Unknown.into();
308 assert_eq!(code, -9999999);
309 }
310
311 #[test]
312 fn test_round_trip_conversion() {
313 let codes = vec![
315 RequestCode::SendMessage,
316 RequestCode::PullMessage,
317 RequestCode::QueryMessage,
318 RequestCode::HeartBeat,
319 RequestCode::PopMessage,
320 RequestCode::RegisterBroker,
321 RequestCode::ControllerElectMaster,
322 RequestCode::AuthCreateUser,
323 RequestCode::Unknown,
324 ];
325
326 for code in codes {
327 let i32_val = code.to_i32();
328 let converted_back = RequestCode::from(i32_val);
329 assert_eq!(code, converted_back, "Round trip failed for {:?}", code);
330 }
331 }
332
333 #[test]
334 fn test_derive_traits() {
335 let code = RequestCode::SendMessage;
337 assert_eq!(format!("{:?}", code), "SendMessage");
338
339 let code1 = RequestCode::HeartBeat;
341 let code2 = code1;
342 let code3 = code1;
343 assert_eq!(code1, code2);
344 assert_eq!(code1, code3);
345
346 assert_eq!(RequestCode::SendMessage, RequestCode::SendMessage);
348 assert_ne!(RequestCode::SendMessage, RequestCode::PullMessage);
349
350 use std::collections::HashSet;
352 let mut set = HashSet::new();
353 set.insert(RequestCode::SendMessage);
354 set.insert(RequestCode::SendMessage); set.insert(RequestCode::PullMessage);
356 assert_eq!(set.len(), 2);
357 }
358
359 #[test]
360 fn test_special_codes() {
361 assert_eq!(RequestCode::from(200050), RequestCode::PopMessage);
363 assert_eq!(RequestCode::from(200051), RequestCode::AckMessage);
364 assert_eq!(RequestCode::from(200151), RequestCode::BatchAckMessage);
365 assert_eq!(RequestCode::from(200052), RequestCode::PeekMessage);
366 assert_eq!(
367 RequestCode::from(200053),
368 RequestCode::ChangeMessageInvisibleTime
369 );
370 assert_eq!(RequestCode::from(200054), RequestCode::Notification);
371 assert_eq!(RequestCode::from(200055), RequestCode::PollingInfo);
372
373 assert_eq!(
375 RequestCode::from(1001),
376 RequestCode::ControllerAlterSyncStateSet
377 );
378 assert_eq!(
379 RequestCode::from(1018),
380 RequestCode::RaftBrokerHeartBeatEventRequest
381 );
382
383 assert_eq!(RequestCode::from(3001), RequestCode::AuthCreateUser);
385 assert_eq!(RequestCode::from(3010), RequestCode::AuthListAcl);
386
387 assert_eq!(
389 RequestCode::from(2001),
390 RequestCode::UpdateColdDataFlowCtrConfig
391 );
392 assert_eq!(RequestCode::from(2004), RequestCode::SetCommitlogReadMode);
393 }
394
395 #[test]
396 fn test_const_fn_to_i32() {
397 const CODE: i32 = RequestCode::SendMessage.to_i32();
399 assert_eq!(CODE, 10);
400 }
401
402 #[test]
403 fn test_repr_i32_size() {
404 use std::mem::size_of;
406 assert_eq!(size_of::<RequestCode>(), size_of::<i32>());
407 }
408}