Skip to main content

rocketmq_protocol/rpc/
topic_request_header.rs

1// Copyright 2023 The RocketMQ Rust Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use cheetah_string::CheetahString;
16use rocketmq_macros::RequestHeaderCodec;
17use serde::Deserialize;
18use serde::Serialize;
19
20use crate::rpc::rpc_request_header::RpcRequestHeader;
21
22#[derive(Clone, Debug, Serialize, Deserialize, Default, RequestHeaderCodec)]
23#[header(
24    type_id = "rocketmq_protocol::rpc::topic_request_header::TopicRequestHeader",
25    java_class = "org.apache.rocketmq.remoting.rpc.TopicRequestHeader"
26)]
27pub struct TopicRequestHeader {
28    #[serde(flatten)]
29    #[header(flatten, presence = "always")]
30    pub rpc_request_header: Option<RpcRequestHeader>,
31    pub lo: Option<bool>,
32}
33
34impl TopicRequestHeader {
35    pub fn get_lo(&self) -> Option<&bool> {
36        self.lo.as_ref()
37    }
38
39    pub fn set_lo(&mut self, lo: bool) {
40        self.lo = Some(lo);
41    }
42
43    pub fn get_broker_name(&self) -> Option<&CheetahString> {
44        self.rpc_request_header.as_ref().and_then(|v| v.broker_name.as_ref())
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use cheetah_string::CheetahString;
51
52    use super::*;
53
54    #[test]
55    fn get_lo_returns_none_when_lo_is_none() {
56        let header = TopicRequestHeader::default();
57        assert_eq!(header.get_lo(), None);
58    }
59
60    #[test]
61    fn get_lo_returns_some_when_lo_is_set() {
62        let mut header = TopicRequestHeader::default();
63        header.set_lo(true);
64        assert_eq!(header.get_lo(), Some(&true));
65    }
66
67    #[test]
68    fn set_lo_updates_lo_value() {
69        let mut header = TopicRequestHeader::default();
70        header.set_lo(false);
71        assert_eq!(header.get_lo(), Some(&false));
72    }
73
74    #[test]
75    fn get_broker_name_returns_none_when_rpc_request_header_is_none() {
76        let header = TopicRequestHeader::default();
77        assert_eq!(header.get_broker_name(), None);
78    }
79
80    #[test]
81    fn get_broker_name_returns_none_when_broker_name_is_none() {
82        let rpc_header = RpcRequestHeader {
83            broker_name: None,
84            ..Default::default()
85        };
86        let header = TopicRequestHeader {
87            rpc_request_header: Some(rpc_header),
88            ..Default::default()
89        };
90        assert_eq!(header.get_broker_name(), None);
91    }
92
93    #[test]
94    fn get_broker_name_returns_some_when_broker_name_is_set() {
95        let broker_name = CheetahString::from("TestBroker");
96        let rpc_header = RpcRequestHeader {
97            broker_name: Some(broker_name.clone()),
98            ..Default::default()
99        };
100        let header = TopicRequestHeader {
101            rpc_request_header: Some(rpc_header),
102            ..Default::default()
103        };
104        assert_eq!(header.get_broker_name(), Some(&broker_name));
105    }
106}