rocketmq_remoting/protocol/header/
change_invisible_time_request_header.rs1use std::fmt::Display;
16
17use cheetah_string::CheetahString;
18use rocketmq_macros::RequestHeaderCodecV2;
19use serde::Deserialize;
20use serde::Serialize;
21
22use crate::rpc::topic_request_header::TopicRequestHeader;
23
24#[derive(Serialize, Deserialize, Debug, Default, RequestHeaderCodecV2)]
25#[serde(rename_all = "camelCase")]
26pub struct ChangeInvisibleTimeRequestHeader {
27 #[required]
28 pub consumer_group: CheetahString,
29
30 #[required]
31 pub topic: CheetahString,
32
33 #[required]
34 pub queue_id: i32,
35
36 #[required]
38 pub extra_info: CheetahString,
39
40 #[required]
41 pub offset: i64,
42
43 #[required]
44 pub invisible_time: i64,
45
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub lite_topic: Option<CheetahString>,
48
49 pub suspend: bool,
50
51 #[serde(flatten)]
52 pub topic_request_header: Option<TopicRequestHeader>,
53}
54
55impl Display for ChangeInvisibleTimeRequestHeader {
56 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
57 write!(
58 f,
59 "ChangeInvisibleTimeRequestHeader {{ consumer_group: {}, topic: {}, queue_id: {}, extra_info: {}, offset: \
60 {}, invisible_time: {}, lite_topic: {:?}, suspend: {} }}",
61 self.consumer_group,
62 self.topic,
63 self.queue_id,
64 self.extra_info,
65 self.offset,
66 self.invisible_time,
67 self.lite_topic,
68 self.suspend
69 )
70 }
71}
72
73#[cfg(test)]
74mod tests {
75 use cheetah_string::CheetahString;
76 use serde_json;
77
78 use super::*;
79 use crate::protocol::command_custom_header::CommandCustomHeader;
80 use crate::protocol::command_custom_header::FromMap;
81
82 #[test]
83 fn change_invisible_time_request_header_display_format() {
84 let header = ChangeInvisibleTimeRequestHeader {
85 consumer_group: CheetahString::from("group1"),
86 topic: CheetahString::from("topic1"),
87 queue_id: 1,
88 extra_info: CheetahString::from("info"),
89 offset: 12345,
90 invisible_time: 67890,
91 lite_topic: None,
92 suspend: false,
93 topic_request_header: None,
94 };
95 assert_eq!(
96 format!("{}", header),
97 "ChangeInvisibleTimeRequestHeader { consumer_group: group1, topic: topic1, queue_id: 1, extra_info: info, \
98 offset: 12345, invisible_time: 67890, lite_topic: None, suspend: false }"
99 );
100 }
101
102 #[test]
103 fn change_invisible_time_request_header_display_format_with_topic_request_header() {
104 let header = ChangeInvisibleTimeRequestHeader {
105 consumer_group: CheetahString::from("group1"),
106 topic: CheetahString::from("topic1"),
107 queue_id: 1,
108 extra_info: CheetahString::from("info"),
109 offset: 12345,
110 invisible_time: 67890,
111 lite_topic: Some(CheetahString::from("lite_topic")),
112 suspend: true,
113 topic_request_header: Some(TopicRequestHeader {
114 rpc_request_header: None,
115 lo: None,
116 }),
117 };
118 assert_eq!(
119 format!("{}", header),
120 "ChangeInvisibleTimeRequestHeader { consumer_group: group1, topic: topic1, queue_id: 1, extra_info: info, \
121 offset: 12345, invisible_time: 67890, lite_topic: Some(\"lite_topic\"), suspend: true }"
122 );
123 }
124
125 #[test]
126 fn change_invisible_time_request_header_serialize() {
127 let header = ChangeInvisibleTimeRequestHeader {
128 consumer_group: CheetahString::from("group1"),
129 topic: CheetahString::from("topic1"),
130 queue_id: 1,
131 extra_info: CheetahString::from("info"),
132 offset: 12345,
133 invisible_time: 67890,
134 lite_topic: Some(CheetahString::from("lite_topic")),
135 suspend: true,
136 topic_request_header: None,
137 };
138 let serialized = serde_json::to_string(&header).unwrap();
139 assert_eq!(
140 serialized,
141 r#"{"consumerGroup":"group1","topic":"topic1","queueId":1,"extraInfo":"info","offset":12345,"invisibleTime":67890,"liteTopic":"lite_topic","suspend":true}"#
142 );
143 }
144
145 #[test]
146 fn change_invisible_time_request_header_deserialize() {
147 let json = r#"{"consumerGroup":"group1","topic":"topic1","queueId":1,"extraInfo":"info","offset":12345,"invisibleTime":67890,"liteTopic":"lite_topic","suspend":true}"#;
148 let header: ChangeInvisibleTimeRequestHeader = serde_json::from_str(json).unwrap();
149 assert_eq!(header.consumer_group, CheetahString::from("group1"));
150 assert_eq!(header.topic, CheetahString::from("topic1"));
151 assert_eq!(header.queue_id, 1);
152 assert_eq!(header.extra_info, CheetahString::from("info"));
153 assert_eq!(header.offset, 12345);
154 assert_eq!(header.invisible_time, 67890);
155 assert_eq!(header.lite_topic.as_deref(), Some("lite_topic"));
156 assert!(header.suspend);
157 }
158
159 #[test]
160 fn change_invisible_time_request_header_maps_lite_topic_and_suspend_like_java_header() {
161 let header = ChangeInvisibleTimeRequestHeader {
162 consumer_group: CheetahString::from("group1"),
163 topic: CheetahString::from("topic1"),
164 queue_id: 1,
165 extra_info: CheetahString::from("info"),
166 offset: 12345,
167 invisible_time: 67890,
168 lite_topic: Some(CheetahString::from("lite_topic")),
169 suspend: true,
170 topic_request_header: None,
171 };
172
173 let map = header.to_map().unwrap();
174 assert_eq!(map.get("liteTopic").map(|value| value.as_str()), Some("lite_topic"));
175 assert_eq!(map.get("suspend").map(|value| value.as_str()), Some("true"));
176
177 let decoded = <ChangeInvisibleTimeRequestHeader as FromMap>::from(&map).unwrap();
178 assert_eq!(decoded.lite_topic.as_deref(), Some("lite_topic"));
179 assert!(decoded.suspend);
180 }
181}