Skip to main content

rocketmq_client_rust/base/
access_channel.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 serde::ser::SerializeStruct;
16use serde::Deserialize;
17use serde::Deserializer;
18use serde::Serialize;
19use serde::Serializer;
20
21#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
22pub enum AccessChannel {
23    #[default]
24    Local,
25    Cloud,
26}
27
28impl Serialize for AccessChannel {
29    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
30    where
31        S: Serializer,
32    {
33        let mut state = serializer.serialize_struct("AccessChannel", 1)?;
34        match *self {
35            AccessChannel::Local => state.serialize_field("AccessChannel", "LOCAL")?,
36            AccessChannel::Cloud => state.serialize_field("AccessChannel", "CLOUD")?,
37        }
38        state.end()
39    }
40}
41
42impl<'de> Deserialize<'de> for AccessChannel {
43    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
44    where
45        D: Deserializer<'de>,
46    {
47        let s: &str = Deserialize::deserialize(deserializer)?;
48        match s {
49            "LOCAL" => Ok(AccessChannel::Local),
50            "CLOUD" => Ok(AccessChannel::Cloud),
51            _ => Err(serde::de::Error::custom("unknown AccessChannel variant")),
52        }
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use serde_json;
59
60    use super::*;
61
62    #[test]
63    fn serialize_access_channel_local() {
64        let channel = AccessChannel::Local;
65        let serialized = serde_json::to_string(&channel).unwrap();
66        assert_eq!(serialized, r#"{"AccessChannel":"LOCAL"}"#);
67    }
68
69    #[test]
70    fn serialize_access_channel_cloud() {
71        let channel = AccessChannel::Cloud;
72        let serialized = serde_json::to_string(&channel).unwrap();
73        assert_eq!(serialized, r#"{"AccessChannel":"CLOUD"}"#);
74    }
75
76    #[test]
77    fn deserialize_access_channel_local() {
78        let json = r#""LOCAL""#;
79        let deserialized: AccessChannel = serde_json::from_str(json).unwrap();
80        assert_eq!(deserialized, AccessChannel::Local);
81    }
82
83    #[test]
84    fn deserialize_access_channel_cloud() {
85        let json = r#""CLOUD""#;
86        let deserialized: AccessChannel = serde_json::from_str(json).unwrap();
87        assert_eq!(deserialized, AccessChannel::Cloud);
88    }
89
90    #[test]
91    fn deserialize_access_channel_unknown_variant() {
92        let json = r#""UNKNOWN""#;
93        let result: Result<AccessChannel, _> = serde_json::from_str(json);
94        assert!(result.is_err());
95    }
96}