Skip to main content

rocketmq_model/common/lite/
lite_subscription_action.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::fmt;
16
17use serde::Deserialize;
18use serde::Deserializer;
19use serde::Serialize;
20use serde::Serializer;
21
22#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Default)]
23pub enum LiteSubscriptionAction {
24    #[default]
25    PartialAdd,
26    PartialRemove,
27    CompleteAdd,
28    CompleteRemove,
29}
30
31impl Serialize for LiteSubscriptionAction {
32    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
33    where
34        S: Serializer,
35    {
36        let value = match self {
37            LiteSubscriptionAction::PartialAdd => "PARTIAL_ADD",
38            LiteSubscriptionAction::PartialRemove => "PARTIAL_REMOVE",
39            LiteSubscriptionAction::CompleteAdd => "COMPLETE_ADD",
40            LiteSubscriptionAction::CompleteRemove => "COMPLETE_REMOVE",
41        };
42        serializer.serialize_str(value)
43    }
44}
45
46impl<'de> Deserialize<'de> for LiteSubscriptionAction {
47    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
48    where
49        D: Deserializer<'de>,
50    {
51        struct LiteSubscriptionActionVisitor;
52
53        impl serde::de::Visitor<'_> for LiteSubscriptionActionVisitor {
54            type Value = LiteSubscriptionAction;
55
56            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
57                formatter.write_str("a string representing LiteSubscriptionAction")
58            }
59
60            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
61            where
62                E: serde::de::Error,
63            {
64                match value {
65                    "PARTIAL_ADD" => Ok(LiteSubscriptionAction::PartialAdd),
66                    "PARTIAL_REMOVE" => Ok(LiteSubscriptionAction::PartialRemove),
67                    "COMPLETE_ADD" => Ok(LiteSubscriptionAction::CompleteAdd),
68                    "COMPLETE_REMOVE" => Ok(LiteSubscriptionAction::CompleteRemove),
69                    _ => Err(serde::de::Error::unknown_variant(
70                        value,
71                        &["PartialAdd", "PartialRemove", "CompleteAdd", "CompleteRemove"],
72                    )),
73                }
74            }
75        }
76
77        deserializer.deserialize_str(LiteSubscriptionActionVisitor)
78    }
79}
80
81impl fmt::Display for LiteSubscriptionAction {
82    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
83        match self {
84            LiteSubscriptionAction::PartialAdd => write!(f, "PARTIAL_ADD"),
85            LiteSubscriptionAction::PartialRemove => write!(f, "PARTIAL_REMOVE"),
86            LiteSubscriptionAction::CompleteAdd => write!(f, "COMPLETE_ADD"),
87            LiteSubscriptionAction::CompleteRemove => write!(f, "COMPLETE_REMOVE"),
88        }
89    }
90}
91
92#[cfg(test)]
93mod tests {
94    use super::*;
95
96    #[test]
97    fn lite_subscription_action_serialize() {
98        assert_eq!(
99            serde_json::to_string(&LiteSubscriptionAction::PartialAdd).unwrap(),
100            "\"PARTIAL_ADD\""
101        );
102        assert_eq!(
103            serde_json::to_string(&LiteSubscriptionAction::PartialRemove).unwrap(),
104            "\"PARTIAL_REMOVE\""
105        );
106        assert_eq!(
107            serde_json::to_string(&LiteSubscriptionAction::CompleteAdd).unwrap(),
108            "\"COMPLETE_ADD\""
109        );
110        assert_eq!(
111            serde_json::to_string(&LiteSubscriptionAction::CompleteRemove).unwrap(),
112            "\"COMPLETE_REMOVE\""
113        );
114    }
115
116    #[test]
117    fn lite_subscription_action_deserialize() {
118        assert_eq!(
119            serde_json::from_str::<LiteSubscriptionAction>("\"PARTIAL_ADD\"").unwrap(),
120            LiteSubscriptionAction::PartialAdd
121        );
122        assert_eq!(
123            serde_json::from_str::<LiteSubscriptionAction>("\"PARTIAL_REMOVE\"").unwrap(),
124            LiteSubscriptionAction::PartialRemove
125        );
126        assert_eq!(
127            serde_json::from_str::<LiteSubscriptionAction>("\"COMPLETE_ADD\"").unwrap(),
128            LiteSubscriptionAction::CompleteAdd
129        );
130        assert_eq!(
131            serde_json::from_str::<LiteSubscriptionAction>("\"COMPLETE_REMOVE\"").unwrap(),
132            LiteSubscriptionAction::CompleteRemove
133        );
134        assert!(serde_json::from_str::<LiteSubscriptionAction>("\"unknown\"").is_err());
135    }
136
137    #[test]
138    fn lite_subscription_action_display() {
139        assert_eq!(format!("{}", LiteSubscriptionAction::PartialAdd), "PARTIAL_ADD");
140        assert_eq!(format!("{}", LiteSubscriptionAction::PartialRemove), "PARTIAL_REMOVE");
141        assert_eq!(format!("{}", LiteSubscriptionAction::CompleteAdd), "COMPLETE_ADD");
142        assert_eq!(format!("{}", LiteSubscriptionAction::CompleteRemove), "COMPLETE_REMOVE");
143    }
144
145    #[test]
146    fn lite_subscription_action_default() {
147        assert_eq!(LiteSubscriptionAction::default(), LiteSubscriptionAction::PartialAdd);
148    }
149}