Skip to main content

rocketmq_remoting/protocol/header/namesrv/
topic_operation_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::RequestHeaderCodecV2;
17use serde::Deserialize;
18use serde::Serialize;
19
20use crate::rpc::rpc_request_header::RpcRequestHeader;
21
22#[derive(Debug, Clone, Deserialize, Serialize, Default, RequestHeaderCodecV2)]
23#[serde(rename_all = "camelCase")]
24pub struct DeleteTopicFromNamesrvRequestHeader {
25    #[required]
26    pub topic: CheetahString,
27    pub cluster_name: Option<CheetahString>,
28}
29
30impl DeleteTopicFromNamesrvRequestHeader {
31    pub fn new(topic: impl Into<CheetahString>, cluster_name: Option<impl Into<CheetahString>>) -> Self {
32        Self {
33            topic: topic.into(),
34            cluster_name: cluster_name.map(|s| s.into()),
35        }
36    }
37}
38
39#[derive(Debug, Clone, Deserialize, Serialize, Default, RequestHeaderCodecV2)]
40#[serde(rename_all = "camelCase")]
41pub struct RegisterTopicRequestHeader {
42    #[required]
43    pub topic: CheetahString,
44    #[serde(flatten)]
45    pub topic_request: Option<TopicRequestHeader>,
46}
47
48impl RegisterTopicRequestHeader {
49    pub fn new(topic: impl Into<CheetahString>) -> Self {
50        Self {
51            topic: topic.into(),
52            topic_request: None,
53        }
54    }
55}
56
57#[derive(Debug, Clone, Deserialize, Serialize, Default, RequestHeaderCodecV2)]
58pub struct GetTopicsByClusterRequestHeader {
59    #[required]
60    pub cluster: CheetahString,
61}
62
63impl GetTopicsByClusterRequestHeader {
64    pub fn new(cluster: impl Into<CheetahString>) -> Self {
65        Self {
66            cluster: cluster.into(),
67        }
68    }
69}
70
71#[derive(Debug, Clone, Deserialize, Serialize, Default, RequestHeaderCodecV2)]
72#[serde(rename_all = "camelCase")]
73pub struct TopicRequestHeader {
74    pub lo: Option<bool>,
75    #[serde(flatten)]
76    pub rpc: Option<RpcRequestHeader>,
77}
78
79#[cfg(test)]
80mod tests {
81    use cheetah_string::CheetahString;
82
83    use super::*;
84
85    #[test]
86    fn delete_topic_from_namesrv_request_header_new() {
87        let header = DeleteTopicFromNamesrvRequestHeader::new("topic1", Some("cluster1"));
88        assert_eq!(header.topic, CheetahString::from("topic1"));
89        assert_eq!(header.cluster_name, Some(CheetahString::from("cluster1")));
90    }
91
92    #[test]
93    fn delete_topic_from_namesrv_request_header_serialization() {
94        let header = DeleteTopicFromNamesrvRequestHeader::new("topic1", Some("cluster1"));
95        let serialized = serde_json::to_string(&header).unwrap();
96        assert_eq!(serialized, r#"{"topic":"topic1","clusterName":"cluster1"}"#);
97    }
98
99    #[test]
100    fn delete_topic_from_namesrv_request_header_deserialization() {
101        let json = r#"{"topic":"topic1","clusterName":"cluster1"}"#;
102        let deserialized: DeleteTopicFromNamesrvRequestHeader = serde_json::from_str(json).unwrap();
103        assert_eq!(deserialized.topic, CheetahString::from("topic1"));
104        assert_eq!(deserialized.cluster_name, Some(CheetahString::from("cluster1")));
105    }
106
107    #[test]
108    fn register_topic_request_header_new() {
109        let header = RegisterTopicRequestHeader::new("topic1");
110        assert_eq!(header.topic, CheetahString::from("topic1"));
111        assert!(header.topic_request.is_none());
112    }
113
114    #[test]
115    fn register_topic_request_header_serialization() {
116        let header = RegisterTopicRequestHeader::new("topic1");
117        let serialized = serde_json::to_string(&header).unwrap();
118        assert_eq!(serialized, r#"{"topic":"topic1"}"#);
119    }
120
121    #[test]
122    fn get_topics_by_cluster_request_header_new() {
123        let header = GetTopicsByClusterRequestHeader::new("cluster1");
124        assert_eq!(header.cluster, CheetahString::from("cluster1"));
125    }
126
127    #[test]
128    fn get_topics_by_cluster_request_header_serialization() {
129        let header = GetTopicsByClusterRequestHeader::new("cluster1");
130        let serialized = serde_json::to_string(&header).unwrap();
131        assert_eq!(serialized, r#"{"cluster":"cluster1"}"#);
132    }
133
134    #[test]
135    fn get_topics_by_cluster_request_header_deserialization() {
136        let json = r#"{"cluster":"cluster1"}"#;
137        let deserialized: GetTopicsByClusterRequestHeader = serde_json::from_str(json).unwrap();
138        assert_eq!(deserialized.cluster, CheetahString::from("cluster1"));
139    }
140}