mz_repr/
network_policy_id.rs1use std::fmt;
11use std::str::FromStr;
12
13use anyhow::{Error, anyhow};
14use mz_lowertest::MzReflect;
15#[cfg(any(test, feature = "proptest"))]
16use proptest_derive::Arbitrary;
17use serde::{Deserialize, Serialize};
18
19const SYSTEM_CHAR: char = 's';
20const USER_CHAR: char = 'u';
21
22#[derive(
24 Clone,
25 Copy,
26 Debug,
27 Eq,
28 PartialEq,
29 Ord,
30 PartialOrd,
31 Hash,
32 Serialize,
33 Deserialize,
34 MzReflect
35)]
36#[cfg_attr(any(test, feature = "proptest"), derive(Arbitrary))]
37pub enum NetworkPolicyId {
38 System(u64),
39 User(u64),
40}
41
42impl NetworkPolicyId {
43 pub fn is_system(&self) -> bool {
44 matches!(self, Self::System(_))
45 }
46
47 pub fn is_user(&self) -> bool {
48 matches!(self, Self::User(_))
49 }
50
51 pub fn is_builtin(&self) -> bool {
52 self.is_system()
53 }
54}
55
56impl FromStr for NetworkPolicyId {
57 type Err = Error;
58
59 fn from_str(s: &str) -> Result<Self, Self::Err> {
60 fn parse_u64(s: &str) -> Result<u64, Error> {
61 if s.len() < 2 {
62 return Err(anyhow!("couldn't parse network policy id '{s}'"));
63 }
64 s[1..]
65 .parse()
66 .map_err(|_| anyhow!("couldn't parse network policy id '{s}'"))
67 }
68
69 match s.chars().next() {
70 Some(SYSTEM_CHAR) => {
71 let val = parse_u64(s)?;
72 Ok(Self::System(val))
73 }
74 Some(USER_CHAR) => {
75 let val = parse_u64(s)?;
76 Ok(Self::User(val))
77 }
78 _ => Err(anyhow!("couldn't parse network policy id '{s}'")),
79 }
80 }
81}
82
83impl fmt::Display for NetworkPolicyId {
84 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
85 match self {
86 Self::System(id) => write!(f, "{SYSTEM_CHAR}{id}"),
87 Self::User(id) => write!(f, "{USER_CHAR}{id}"),
88 }
89 }
90}
91
92#[mz_ore::test]
93fn test_network_policy_id_parsing() {
94 let s = "s42";
95 let network_policy_id: NetworkPolicyId = s.parse().unwrap();
96 assert_eq!(NetworkPolicyId::System(42), network_policy_id);
97 assert_eq!(s, network_policy_id.to_string());
98
99 let s = "u666";
100 let network_policy_id: NetworkPolicyId = s.parse().unwrap();
101 assert_eq!(NetworkPolicyId::User(666), network_policy_id);
102 assert_eq!(s, network_policy_id.to_string());
103
104 let s = "d23";
105 mz_ore::assert_err!(s.parse::<NetworkPolicyId>());
106
107 let s = "asfje90uf23i";
108 mz_ore::assert_err!(s.parse::<NetworkPolicyId>());
109
110 let s = "";
111 mz_ore::assert_err!(s.parse::<NetworkPolicyId>());
112}