rocketmq_client_rust/base/
access_channel.rs

1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17use serde::ser::SerializeStruct;
18use serde::Deserialize;
19use serde::Deserializer;
20use serde::Serialize;
21use serde::Serializer;
22
23#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
24pub enum AccessChannel {
25    #[default]
26    Local,
27    Cloud,
28}
29
30impl Serialize for AccessChannel {
31    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
32    where
33        S: Serializer,
34    {
35        let mut state = serializer.serialize_struct("AccessChannel", 1)?;
36        match *self {
37            AccessChannel::Local => state.serialize_field("AccessChannel", "LOCAL")?,
38            AccessChannel::Cloud => state.serialize_field("AccessChannel", "CLOUD")?,
39        }
40        state.end()
41    }
42}
43
44impl<'de> Deserialize<'de> for AccessChannel {
45    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
46    where
47        D: Deserializer<'de>,
48    {
49        let s: &str = Deserialize::deserialize(deserializer)?;
50        match s {
51            "LOCAL" => Ok(AccessChannel::Local),
52            "CLOUD" => Ok(AccessChannel::Cloud),
53            _ => Err(serde::de::Error::custom("unknown AccessChannel variant")),
54        }
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use serde_json;
61
62    use super::*;
63
64    #[test]
65    fn serialize_access_channel_local() {
66        let channel = AccessChannel::Local;
67        let serialized = serde_json::to_string(&channel).unwrap();
68        assert_eq!(serialized, r#"{"AccessChannel":"LOCAL"}"#);
69    }
70
71    #[test]
72    fn serialize_access_channel_cloud() {
73        let channel = AccessChannel::Cloud;
74        let serialized = serde_json::to_string(&channel).unwrap();
75        assert_eq!(serialized, r#"{"AccessChannel":"CLOUD"}"#);
76    }
77
78    #[test]
79    fn deserialize_access_channel_local() {
80        let json = r#""LOCAL""#;
81        let deserialized: AccessChannel = serde_json::from_str(json).unwrap();
82        assert_eq!(deserialized, AccessChannel::Local);
83    }
84
85    #[test]
86    fn deserialize_access_channel_cloud() {
87        let json = r#""CLOUD""#;
88        let deserialized: AccessChannel = serde_json::from_str(json).unwrap();
89        assert_eq!(deserialized, AccessChannel::Cloud);
90    }
91
92    #[test]
93    fn deserialize_access_channel_unknown_variant() {
94        let json = r#""UNKNOWN""#;
95        let result: Result<AccessChannel, _> = serde_json::from_str(json);
96        assert!(result.is_err());
97    }
98}