rocketmq_error/unified/
protocol.rs1use thiserror::Error;
21
22#[derive(Debug, Error)]
24pub enum ProtocolError {
25 #[error("Invalid command code: {code}")]
27 InvalidCommand { code: i32 },
28
29 #[error("Unsupported protocol version: {version}")]
31 UnsupportedVersion { version: i32 },
32
33 #[error("Missing required header field: {field}")]
35 HeaderMissing { field: &'static str },
36
37 #[error("Missing required message body")]
39 BodyMissing,
40
41 #[error("Checksum mismatch: expected {expected:x}, got {actual:x}")]
43 ChecksumMismatch { expected: u32, actual: u32 },
44
45 #[error("Invalid message format: {reason}")]
47 InvalidMessage { reason: String },
48
49 #[error(
51 "Protocol decode error: ext_fields_length={ext_fields_len}, header_length={header_len}"
52 )]
53 DecodeError {
54 ext_fields_len: usize,
55 header_len: usize,
56 },
57
58 #[error("Unsupported serialization type: {serialize_type}")]
60 UnsupportedSerializationType { serialize_type: u8 },
61}
62
63impl ProtocolError {
64 #[inline]
66 pub fn invalid_command(code: i32) -> Self {
67 Self::InvalidCommand { code }
68 }
69
70 #[inline]
72 pub fn header_missing(field: &'static str) -> Self {
73 Self::HeaderMissing { field }
74 }
75
76 #[inline]
78 pub fn checksum_mismatch(expected: u32, actual: u32) -> Self {
79 Self::ChecksumMismatch { expected, actual }
80 }
81
82 #[inline]
84 pub fn invalid_message(reason: impl Into<String>) -> Self {
85 Self::InvalidMessage {
86 reason: reason.into(),
87 }
88 }
89}
90
91#[cfg(test)]
92mod tests {
93 use super::*;
94
95 #[test]
96 fn test_protocol_error() {
97 let err = ProtocolError::invalid_command(999);
98 assert_eq!(err.to_string(), "Invalid command code: 999");
99 }
100
101 #[test]
102 fn test_checksum_mismatch() {
103 let err = ProtocolError::checksum_mismatch(0xABCD, 0x1234);
104 assert!(err.to_string().contains("abcd"));
105 assert!(err.to_string().contains("1234"));
106 }
107}