Skip to main content

rocketmq_auth/authentication/enums/
user_status.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::Deserialize;
16use serde::Deserializer;
17use serde::Serialize;
18use serde::Serializer;
19
20#[repr(u8)]
21#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22pub enum UserStatus {
23    Enable = 1,
24    Disable = 2,
25}
26
27impl UserStatus {
28    #[inline]
29    pub fn get_by_name(name: &str) -> Option<Self> {
30        if name.eq_ignore_ascii_case("enable") {
31            Some(UserStatus::Enable)
32        } else if name.eq_ignore_ascii_case("disable") {
33            Some(UserStatus::Disable)
34        } else {
35            None
36        }
37    }
38
39    #[inline]
40    pub fn code(self) -> u8 {
41        self as u8
42    }
43
44    #[inline]
45    pub fn name(self) -> &'static str {
46        match self {
47            UserStatus::Enable => "enable",
48            UserStatus::Disable => "disable",
49        }
50    }
51}
52
53impl Serialize for UserStatus {
54    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
55    where
56        S: Serializer,
57    {
58        serializer.serialize_u8(*self as u8)
59    }
60}
61
62impl<'de> Deserialize<'de> for UserStatus {
63    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
64    where
65        D: Deserializer<'de>,
66    {
67        let v = u8::deserialize(deserializer)?;
68        match v {
69            1 => Ok(UserStatus::Enable),
70            2 => Ok(UserStatus::Disable),
71            _ => Err(serde::de::Error::custom("invalid UserStatus")),
72        }
73    }
74}
75
76#[cfg(test)]
77mod tests {
78    use serde_json;
79
80    use super::*;
81
82    #[test]
83    fn test_get_by_name() {
84        assert_eq!(UserStatus::get_by_name("enable"), Some(UserStatus::Enable));
85        assert_eq!(UserStatus::get_by_name("ENABLE"), Some(UserStatus::Enable));
86        assert_eq!(UserStatus::get_by_name("Enable"), Some(UserStatus::Enable));
87        assert_eq!(UserStatus::get_by_name("disable"), Some(UserStatus::Disable));
88        assert_eq!(UserStatus::get_by_name("DISABLE"), Some(UserStatus::Disable));
89        assert_eq!(UserStatus::get_by_name("Disable"), Some(UserStatus::Disable));
90        assert_eq!(UserStatus::get_by_name("invalid"), None);
91        assert_eq!(UserStatus::get_by_name(""), None);
92    }
93
94    #[test]
95    fn test_code() {
96        assert_eq!(UserStatus::Enable.code(), 1);
97        assert_eq!(UserStatus::Disable.code(), 2);
98    }
99
100    #[test]
101    fn test_name() {
102        assert_eq!(UserStatus::Enable.name(), "enable");
103        assert_eq!(UserStatus::Disable.name(), "disable");
104    }
105
106    #[test]
107    fn test_serialize() {
108        let enable_json = serde_json::to_string(&UserStatus::Enable).unwrap();
109        assert_eq!(enable_json, "1");
110
111        let disable_json = serde_json::to_string(&UserStatus::Disable).unwrap();
112        assert_eq!(disable_json, "2");
113    }
114
115    #[test]
116    fn test_deserialize() {
117        let enable: UserStatus = serde_json::from_str("1").unwrap();
118        assert_eq!(enable, UserStatus::Enable);
119
120        let disable: UserStatus = serde_json::from_str("2").unwrap();
121        assert_eq!(disable, UserStatus::Disable);
122    }
123
124    #[test]
125    fn test_deserialize_invalid() {
126        let result: Result<UserStatus, _> = serde_json::from_str("0");
127        assert!(result.is_err());
128
129        let result: Result<UserStatus, _> = serde_json::from_str("3");
130        assert!(result.is_err());
131
132        let result: Result<UserStatus, _> = serde_json::from_str("\"invalid\"");
133        assert!(result.is_err());
134    }
135
136    #[test]
137    fn test_round_trip_serialization() {
138        let original = UserStatus::Enable;
139        let serialized = serde_json::to_string(&original).unwrap();
140        let deserialized: UserStatus = serde_json::from_str(&serialized).unwrap();
141        assert_eq!(original, deserialized);
142
143        let original = UserStatus::Disable;
144        let serialized = serde_json::to_string(&original).unwrap();
145        let deserialized: UserStatus = serde_json::from_str(&serialized).unwrap();
146        assert_eq!(original, deserialized);
147    }
148}