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