Skip to main content

rocketmq_protocol/protocol/body/
message_request_mode_serialize_wrapper.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 std::collections::HashMap;
16
17use cheetah_string::CheetahString;
18
19use crate::protocol::body::set_message_request_mode_request_body::SetMessageRequestModeRequestBody;
20
21pub type MessageRequestModeMap =
22    HashMap<CheetahString /* Topic */, HashMap<CheetahString /* Group */, SetMessageRequestModeRequestBody>>;
23
24#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, Default)]
25#[serde(rename_all = "camelCase")]
26pub struct MessageRequestModeSerializeWrapper {
27    message_request_mode_map: MessageRequestModeMap,
28}
29
30impl MessageRequestModeSerializeWrapper {
31    pub fn new(message_request_mode_map: MessageRequestModeMap) -> Self {
32        Self {
33            message_request_mode_map,
34        }
35    }
36
37    pub fn message_request_mode_map(&self) -> &MessageRequestModeMap {
38        &self.message_request_mode_map
39    }
40
41    pub fn into_inner(self) -> MessageRequestModeMap {
42        self.message_request_mode_map
43    }
44
45    pub fn from_inner(message_request_mode_map: MessageRequestModeMap) -> Self {
46        Self {
47            message_request_mode_map,
48        }
49    }
50
51    pub fn set_message_request_mode_map(&mut self, map: MessageRequestModeMap) {
52        self.message_request_mode_map = map;
53    }
54}
55#[cfg(test)]
56mod tests {
57    use super::*;
58    use crate::protocol::body::set_message_request_mode_request_body::SetMessageRequestModeRequestBody;
59
60    #[test]
61    fn wrapper_methods_and_serde_preserve_the_nested_map() {
62        let mut map = MessageRequestModeMap::new();
63        let mut group_map = HashMap::new();
64        group_map.insert(
65            CheetahString::from("group1"),
66            SetMessageRequestModeRequestBody::default(),
67        );
68        map.insert(CheetahString::from("topic1"), group_map);
69
70        let mut wrapper = MessageRequestModeSerializeWrapper::new(map);
71        assert_eq!(wrapper.message_request_mode_map().len(), 1);
72        assert!(wrapper
73            .message_request_mode_map()
74            .contains_key(&CheetahString::from("topic1")));
75
76        let encoded = serde_json::to_vec(&wrapper).expect("serialize request mode map");
77        let decoded: MessageRequestModeSerializeWrapper =
78            serde_json::from_slice(&encoded).expect("deserialize request mode map");
79        wrapper.set_message_request_mode_map(decoded.into_inner());
80        let map = MessageRequestModeSerializeWrapper::from_inner(wrapper.into_inner()).into_inner();
81        let group_map = map
82            .get(&CheetahString::from("topic1"))
83            .expect("topic should survive the round trip");
84        assert!(group_map.contains_key(&CheetahString::from("group1")));
85    }
86}