1pub mod get;
13pub mod helpers;
14pub mod query;
15pub mod set;
16
17use crate::core::set::{list_not_set, map_not_set, string_not_set};
18use ahash::AHashMap;
19use serde::{Deserialize, Serialize};
20use std::fmt::Display;
21
22use crate::{
23 core::{changes::ChangesObject, Object},
24 Get, Set,
25};
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct Principal<State = Get> {
29 #[serde(skip)]
30 _create_id: Option<usize>,
31
32 #[serde(skip)]
33 _state: std::marker::PhantomData<State>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
36 id: Option<String>,
37
38 #[serde(rename = "type")]
39 #[serde(skip_serializing_if = "Option::is_none")]
40 ptype: Option<Type>,
41
42 #[serde(skip_serializing_if = "string_not_set")]
43 name: Option<String>,
44
45 #[serde(skip_serializing_if = "string_not_set")]
46 description: Option<String>,
47
48 #[serde(skip_serializing_if = "string_not_set")]
49 email: Option<String>,
50
51 #[serde(skip_serializing_if = "string_not_set")]
52 timezone: Option<String>,
53
54 #[serde(skip_serializing_if = "list_not_set")]
55 capabilities: Option<Vec<String>>,
56
57 #[serde(skip_serializing_if = "list_not_set")]
58 aliases: Option<Vec<String>>,
59
60 #[serde(skip_serializing_if = "string_not_set")]
61 secret: Option<String>,
62
63 #[serde(skip_serializing_if = "Option::is_none")]
64 dkim: Option<DKIM>,
65
66 #[serde(skip_serializing_if = "Option::is_none")]
67 quota: Option<u32>,
68
69 #[serde(skip_serializing_if = "string_not_set")]
70 picture: Option<String>,
71
72 #[serde(skip_serializing_if = "list_not_set")]
73 members: Option<Vec<String>>,
74
75 #[serde(skip_serializing_if = "map_not_set")]
76 acl: Option<AHashMap<String, Vec<ACL>>>,
77
78 #[serde(flatten)]
79 #[serde(skip_deserializing)]
80 #[serde(skip_serializing_if = "Option::is_none")]
81 property_patch: Option<AHashMap<String, bool>>,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Copy)]
85pub enum Property {
86 #[serde(rename = "id")]
87 Id = 0,
88 #[serde(rename = "type")]
89 Type = 1,
90 #[serde(rename = "name")]
91 Name = 2,
92 #[serde(rename = "description")]
93 Description = 3,
94 #[serde(rename = "email")]
95 Email = 4,
96 #[serde(rename = "timezone")]
97 Timezone = 5,
98 #[serde(rename = "capabilities")]
99 Capabilities = 6,
100 #[serde(rename = "aliases")]
101 Aliases = 7,
102 #[serde(rename = "secret")]
103 Secret = 8,
104 #[serde(rename = "dkim")]
105 DKIM = 9,
106 #[serde(rename = "quota")]
107 Quota = 10,
108 #[serde(rename = "picture")]
109 Picture = 11,
110 #[serde(rename = "members")]
111 Members = 12,
112 #[serde(rename = "shareWith")]
113 ShareWith = 13,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, Copy)]
117pub enum ACL {
118 #[serde(rename = "mayRename")]
119 Rename = 1,
120 #[serde(rename = "mayDelete")]
121 Delete = 2,
122 #[serde(rename = "mayReadItems")]
123 ReadItems = 3,
124 #[serde(rename = "mayAddItems")]
125 AddItems = 4,
126 #[serde(rename = "maySetKeywords")]
127 SetKeywords = 5,
128 #[serde(rename = "mayRemoveItems")]
129 RemoveItems = 6,
130 #[serde(rename = "mayCreateChild")]
131 CreateChild = 7,
132 #[serde(rename = "mayShare")]
133 Administer = 8,
134 #[serde(rename = "maySubmit")]
135 Submit = 10,
136 #[serde(rename = "maySetSeen")]
137 SetSeen = 11,
138}
139
140#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
141pub enum Type {
142 #[serde(rename = "individual")]
143 Individual,
144 #[serde(rename = "group")]
145 Group,
146 #[serde(rename = "resource")]
147 Resource,
148 #[serde(rename = "location")]
149 Location,
150 #[serde(rename = "domain")]
151 Domain,
152 #[serde(rename = "list")]
153 List,
154 #[serde(rename = "other")]
155 Other,
156}
157
158#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
159pub struct DKIM {
160 #[serde(rename = "dkimSelector")]
161 dkim_selector: Option<String>,
162 #[serde(rename = "dkimExpiration")]
163 dkim_expiration: Option<i64>,
164}
165
166impl DKIM {
167 pub fn new(dkim_selector: Option<impl Into<String>>, dkim_expiration: Option<i64>) -> DKIM {
168 DKIM {
169 dkim_selector: dkim_selector.map(Into::into),
170 dkim_expiration,
171 }
172 }
173
174 pub fn selector(&self) -> Option<&str> {
175 self.dkim_selector.as_deref()
176 }
177
178 pub fn expiration(&self) -> Option<i64> {
179 self.dkim_expiration
180 }
181}
182
183impl Display for Property {
184 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
185 match self {
186 Property::Id => write!(f, "id"),
187 Property::Type => write!(f, "type"),
188 Property::Name => write!(f, "name"),
189 Property::Description => write!(f, "description"),
190 Property::Email => write!(f, "email"),
191 Property::Timezone => write!(f, "timezone"),
192 Property::Capabilities => write!(f, "capabilities"),
193 Property::Aliases => write!(f, "aliases"),
194 Property::Secret => write!(f, "secret"),
195 Property::DKIM => write!(f, "dkim"),
196 Property::Quota => write!(f, "quota"),
197 Property::Picture => write!(f, "picture"),
198 Property::Members => write!(f, "members"),
199 Property::ShareWith => write!(f, "shareWith"),
200 }
201 }
202}
203
204impl Display for ACL {
205 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
206 match self {
207 ACL::Rename => write!(f, "rename"),
208 ACL::Delete => write!(f, "delete"),
209 ACL::ReadItems => write!(f, "readItems"),
210 ACL::AddItems => write!(f, "addItems"),
211 ACL::SetKeywords => write!(f, "setKeywords"),
212 ACL::RemoveItems => write!(f, "removeItems"),
213 ACL::CreateChild => write!(f, "createChild"),
214 ACL::Administer => write!(f, "administer"),
215 ACL::Submit => write!(f, "submit"),
216 ACL::SetSeen => write!(f, "setSeen"),
217 }
218 }
219}
220
221impl Object for Principal<Set> {
222 type Property = Property;
223
224 fn requires_account_id() -> bool {
225 true
226 }
227}
228
229impl Object for Principal<Get> {
230 type Property = Property;
231
232 fn requires_account_id() -> bool {
233 true
234 }
235}
236
237impl ChangesObject for Principal<Set> {
238 type ChangesResponse = ();
239}
240
241impl ChangesObject for Principal<Get> {
242 type ChangesResponse = ();
243}