rocketmq_remoting/protocol/header/
get_topic_config_request_header.rs1use cheetah_string::CheetahString;
16use rocketmq_macros::RequestHeaderCodecV2;
17use serde::Deserialize;
18use serde::Serialize;
19
20use crate::protocol::header::message_operation_header::TopicRequestHeaderTrait;
21use crate::rpc::rpc_request_header::RpcRequestHeader;
22use crate::rpc::topic_request_header::TopicRequestHeader;
23
24#[derive(Serialize, Deserialize, Debug, RequestHeaderCodecV2)]
25pub struct GetTopicConfigRequestHeader {
26 #[required]
27 #[serde(rename = "topic")]
28 pub topic: CheetahString,
29
30 #[serde(flatten)]
31 pub topic_request_header: Option<TopicRequestHeader>,
32}
33
34impl GetTopicConfigRequestHeader {
35 pub fn get_topic(&self) -> &CheetahString {
36 &self.topic
37 }
38 pub fn set_topic(&mut self, topic: CheetahString) {
39 self.topic = topic;
40 }
41}
42
43impl TopicRequestHeaderTrait for GetTopicConfigRequestHeader {
44 fn set_lo(&mut self, lo: Option<bool>) {
45 self.topic_request_header
46 .get_or_insert_with(TopicRequestHeader::default)
47 .lo = lo;
48 }
49
50 fn lo(&self) -> Option<bool> {
51 self.topic_request_header.as_ref().and_then(|header| header.lo)
52 }
53
54 fn set_topic(&mut self, topic: CheetahString) {
55 self.topic = topic;
56 }
57
58 fn topic(&self) -> &CheetahString {
59 &self.topic
60 }
61
62 fn broker_name(&self) -> Option<&CheetahString> {
63 self.topic_request_header
64 .as_ref()
65 .and_then(|header| header.rpc_request_header.as_ref())
66 .and_then(|rpc| rpc.broker_name.as_ref())
67 }
68
69 fn set_broker_name(&mut self, broker_name: CheetahString) {
70 self.topic_request_header
71 .get_or_insert_with(TopicRequestHeader::default)
72 .rpc_request_header
73 .get_or_insert_with(RpcRequestHeader::default)
74 .broker_name = Some(broker_name);
75 }
76
77 fn namespace(&self) -> Option<&str> {
78 self.topic_request_header
79 .as_ref()
80 .and_then(|header| header.rpc_request_header.as_ref())
81 .and_then(|rpc| rpc.namespace.as_deref())
82 }
83
84 fn set_namespace(&mut self, namespace: CheetahString) {
85 self.topic_request_header
86 .get_or_insert_with(TopicRequestHeader::default)
87 .rpc_request_header
88 .get_or_insert_with(RpcRequestHeader::default)
89 .namespace = Some(namespace);
90 }
91
92 fn namespaced(&self) -> Option<bool> {
93 self.topic_request_header
94 .as_ref()
95 .and_then(|header| header.rpc_request_header.as_ref())
96 .and_then(|rpc| rpc.namespaced)
97 }
98
99 fn set_namespaced(&mut self, namespaced: bool) {
100 self.topic_request_header
101 .get_or_insert_with(TopicRequestHeader::default)
102 .rpc_request_header
103 .get_or_insert_with(RpcRequestHeader::default)
104 .namespaced = Some(namespaced);
105 }
106
107 fn oneway(&self) -> Option<bool> {
108 self.topic_request_header
109 .as_ref()
110 .and_then(|header| header.rpc_request_header.as_ref())
111 .and_then(|rpc| rpc.oneway)
112 }
113
114 fn set_oneway(&mut self, oneway: bool) {
115 self.topic_request_header
116 .get_or_insert_with(TopicRequestHeader::default)
117 .rpc_request_header
118 .get_or_insert_with(RpcRequestHeader::default)
119 .oneway = Some(oneway);
120 }
121
122 fn queue_id(&self) -> i32 {
123 -1
124 }
125
126 fn set_queue_id(&mut self, _queue_id: i32) {}
127}
128
129#[cfg(test)]
130mod tests {
131 use std::collections::HashMap;
132
133 use super::*;
134 use crate::protocol::command_custom_header::FromMap;
135
136 #[test]
137 fn get_topic_config_request_header_serialization() {
138 let header = GetTopicConfigRequestHeader {
139 topic: CheetahString::from("topic1"),
140 topic_request_header: None,
141 };
142 let json = serde_json::to_string(&header).unwrap();
143 assert!(json.contains("\"topic\":\"topic1\""));
144 }
145
146 #[test]
147 fn get_topic_config_request_header_deserialization() {
148 let json = r#"{"topic":"topic1"}"#;
149 let header: GetTopicConfigRequestHeader = serde_json::from_str(json).unwrap();
150 assert_eq!(header.topic, "topic1");
151 }
152
153 #[test]
154 fn get_topic_config_request_header_from_map() {
155 let mut map = HashMap::new();
156 map.insert(CheetahString::from("topic"), CheetahString::from("topic1"));
157 let header = <GetTopicConfigRequestHeader as FromMap>::from(&map).unwrap();
158 assert_eq!(header.topic, "topic1");
159 }
160
161 #[test]
162 fn getters_and_setters() {
163 let mut header = GetTopicConfigRequestHeader {
164 topic: CheetahString::from("topic1"),
165 topic_request_header: None,
166 };
167 assert_eq!(header.get_topic(), "topic1");
168 header.set_topic(CheetahString::from("topic2"));
169 assert_eq!(header.get_topic(), "topic2");
170 }
171}