Skip to main content

awp_types/
trust.rs

1use serde::{Deserialize, Serialize};
2use std::fmt;
3
4/// Classification of the trust relationship with a requester.
5///
6/// Ordering is defined by discriminant: `Anonymous < Known < Partner < Internal`.
7///
8/// # Example
9///
10/// ```
11/// use awp_types::TrustLevel;
12///
13/// assert!(TrustLevel::Anonymous < TrustLevel::Known);
14/// assert!(TrustLevel::Known < TrustLevel::Partner);
15/// assert!(TrustLevel::Partner < TrustLevel::Internal);
16/// ```
17#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
18#[serde(rename_all = "lowercase")]
19pub enum TrustLevel {
20    Anonymous = 0,
21    Known = 1,
22    Partner = 2,
23    Internal = 3,
24}
25
26impl fmt::Display for TrustLevel {
27    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28        match self {
29            TrustLevel::Anonymous => write!(f, "anonymous"),
30            TrustLevel::Known => write!(f, "known"),
31            TrustLevel::Partner => write!(f, "partner"),
32            TrustLevel::Internal => write!(f, "internal"),
33        }
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn test_ordering() {
43        assert!(TrustLevel::Anonymous < TrustLevel::Known);
44        assert!(TrustLevel::Known < TrustLevel::Partner);
45        assert!(TrustLevel::Partner < TrustLevel::Internal);
46    }
47
48    #[test]
49    fn test_display_anonymous() {
50        assert_eq!(TrustLevel::Anonymous.to_string(), "anonymous");
51    }
52
53    #[test]
54    fn test_display_known() {
55        assert_eq!(TrustLevel::Known.to_string(), "known");
56    }
57
58    #[test]
59    fn test_display_partner() {
60        assert_eq!(TrustLevel::Partner.to_string(), "partner");
61    }
62
63    #[test]
64    fn test_display_internal() {
65        assert_eq!(TrustLevel::Internal.to_string(), "internal");
66    }
67
68    #[test]
69    fn test_serde_round_trip() {
70        for level in
71            [TrustLevel::Anonymous, TrustLevel::Known, TrustLevel::Partner, TrustLevel::Internal]
72        {
73            let json = serde_json::to_string(&level).unwrap();
74            let deserialized: TrustLevel = serde_json::from_str(&json).unwrap();
75            assert_eq!(level, deserialized);
76        }
77    }
78
79    #[test]
80    fn test_serde_lowercase() {
81        assert_eq!(serde_json::to_string(&TrustLevel::Anonymous).unwrap(), "\"anonymous\"");
82        assert_eq!(serde_json::to_string(&TrustLevel::Known).unwrap(), "\"known\"");
83        assert_eq!(serde_json::to_string(&TrustLevel::Partner).unwrap(), "\"partner\"");
84        assert_eq!(serde_json::to_string(&TrustLevel::Internal).unwrap(), "\"internal\"");
85    }
86}