Skip to main content

systemprompt_models/auth/
enums.rs

1use serde::{Deserialize, Serialize};
2use std::fmt;
3use std::str::FromStr;
4
5use crate::errors::ParseEnumError;
6
7#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
8#[serde(rename_all = "lowercase")]
9pub enum JwtAudience {
10    Web,
11    Api,
12    A2a,
13    Mcp,
14    Internal,
15    Cowork,
16    #[serde(untagged)]
17    Resource(String),
18}
19
20impl JwtAudience {
21    pub fn as_str(&self) -> &str {
22        match self {
23            Self::Web => "web",
24            Self::Api => "api",
25            Self::A2a => "a2a",
26            Self::Mcp => "mcp",
27            Self::Internal => "internal",
28            Self::Cowork => "cowork",
29            Self::Resource(s) => s.as_str(),
30        }
31    }
32
33    pub fn standard() -> Vec<Self> {
34        vec![Self::Web, Self::Api, Self::A2a, Self::Mcp]
35    }
36
37    pub fn service() -> Vec<Self> {
38        vec![Self::Api, Self::Mcp, Self::A2a, Self::Internal]
39    }
40}
41
42impl fmt::Display for JwtAudience {
43    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44        write!(f, "{}", self.as_str())
45    }
46}
47
48impl FromStr for JwtAudience {
49    type Err = ParseEnumError;
50    fn from_str(s: &str) -> Result<Self, Self::Err> {
51        match s {
52            "web" => Ok(Self::Web),
53            "api" => Ok(Self::Api),
54            "a2a" => Ok(Self::A2a),
55            "mcp" => Ok(Self::Mcp),
56            "internal" => Ok(Self::Internal),
57            "cowork" => Ok(Self::Cowork),
58            _ => Ok(Self::Resource(s.to_string())),
59        }
60    }
61}
62
63#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
64#[serde(rename_all = "lowercase")]
65pub enum UserType {
66    Admin,
67    User,
68    A2a,
69    Mcp,
70    Service,
71    Anon,
72    Unknown,
73}
74
75impl UserType {
76    pub const fn as_str(&self) -> &'static str {
77        match self {
78            Self::Admin => "admin",
79            Self::User => "user",
80            Self::A2a => "a2a",
81            Self::Mcp => "mcp",
82            Self::Service => "service",
83            Self::Anon => "anon",
84            Self::Unknown => "unknown",
85        }
86    }
87
88    pub const fn rate_tier(&self) -> RateLimitTier {
89        match self {
90            Self::Admin => RateLimitTier::Admin,
91            Self::User => RateLimitTier::User,
92            Self::A2a => RateLimitTier::A2a,
93            Self::Mcp => RateLimitTier::Mcp,
94            Self::Service => RateLimitTier::Service,
95            Self::Anon | Self::Unknown => RateLimitTier::Anon,
96        }
97    }
98}
99
100impl fmt::Display for UserType {
101    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
102        write!(f, "{}", self.as_str())
103    }
104}
105
106impl FromStr for UserType {
107    type Err = ParseEnumError;
108    fn from_str(s: &str) -> Result<Self, Self::Err> {
109        match s {
110            "admin" => Ok(Self::Admin),
111            "user" => Ok(Self::User),
112            "a2a" => Ok(Self::A2a),
113            "mcp" => Ok(Self::Mcp),
114            "service" => Ok(Self::Service),
115            "anon" => Ok(Self::Anon),
116            "unknown" => Ok(Self::Unknown),
117            _ => Err(ParseEnumError::new("user_type", s)),
118        }
119    }
120}
121
122#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
123pub enum TokenType {
124    #[default]
125    Bearer,
126}
127
128impl TokenType {
129    pub const fn as_str(self) -> &'static str {
130        match self {
131            Self::Bearer => "Bearer",
132        }
133    }
134}
135
136impl fmt::Display for TokenType {
137    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
138        write!(f, "Bearer")
139    }
140}
141
142#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
143#[serde(rename_all = "lowercase")]
144pub enum RateLimitTier {
145    Admin,
146    User,
147    A2a,
148    Mcp,
149    Service,
150    Anon,
151}
152
153impl RateLimitTier {
154    pub const fn as_str(&self) -> &'static str {
155        match self {
156            Self::Admin => "admin",
157            Self::User => "user",
158            Self::A2a => "a2a",
159            Self::Mcp => "mcp",
160            Self::Service => "service",
161            Self::Anon => "anon",
162        }
163    }
164}
165
166impl fmt::Display for RateLimitTier {
167    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
168        write!(f, "{}", self.as_str())
169    }
170}
171
172impl FromStr for RateLimitTier {
173    type Err = ParseEnumError;
174    fn from_str(s: &str) -> Result<Self, Self::Err> {
175        match s {
176            "admin" => Ok(Self::Admin),
177            "user" => Ok(Self::User),
178            "a2a" => Ok(Self::A2a),
179            "mcp" => Ok(Self::Mcp),
180            "service" => Ok(Self::Service),
181            "anon" => Ok(Self::Anon),
182            _ => Err(ParseEnumError::new("rate_limit_tier", s)),
183        }
184    }
185}
186
187#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
188#[serde(rename_all = "lowercase")]
189pub enum UserRole {
190    Admin,
191    User,
192    Anonymous,
193}
194
195impl UserRole {
196    pub const fn as_str(&self) -> &'static str {
197        match self {
198            Self::Admin => "admin",
199            Self::User => "user",
200            Self::Anonymous => "anonymous",
201        }
202    }
203}
204
205impl fmt::Display for UserRole {
206    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
207        write!(f, "{}", self.as_str())
208    }
209}
210
211impl FromStr for UserRole {
212    type Err = ParseEnumError;
213    fn from_str(s: &str) -> Result<Self, Self::Err> {
214        match s {
215            "admin" => Ok(Self::Admin),
216            "user" => Ok(Self::User),
217            "anonymous" => Ok(Self::Anonymous),
218            _ => Err(ParseEnumError::new("user_role", s)),
219        }
220    }
221}
222
223#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
224#[serde(rename_all = "lowercase")]
225pub enum UserStatus {
226    Active,
227    Inactive,
228    Suspended,
229    Pending,
230    Deleted,
231    Temporary,
232}
233
234impl UserStatus {
235    pub const fn as_str(&self) -> &'static str {
236        match self {
237            Self::Active => "active",
238            Self::Inactive => "inactive",
239            Self::Suspended => "suspended",
240            Self::Pending => "pending",
241            Self::Deleted => "deleted",
242            Self::Temporary => "temporary",
243        }
244    }
245
246    pub const fn is_active(&self) -> bool {
247        matches!(self, Self::Active)
248    }
249}
250
251impl fmt::Display for UserStatus {
252    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
253        write!(f, "{}", self.as_str())
254    }
255}
256
257impl FromStr for UserStatus {
258    type Err = ParseEnumError;
259    fn from_str(s: &str) -> Result<Self, Self::Err> {
260        match s {
261            "active" => Ok(Self::Active),
262            "inactive" => Ok(Self::Inactive),
263            "suspended" => Ok(Self::Suspended),
264            "pending" => Ok(Self::Pending),
265            "deleted" => Ok(Self::Deleted),
266            "temporary" => Ok(Self::Temporary),
267            _ => Err(ParseEnumError::new("user_status", s)),
268        }
269    }
270}