jmap_client/principal/
mod.rs

1/*
2 * Copyright Stalwart Labs LLC See the COPYING
3 * file at the top-level directory of this distribution.
4 *
5 * Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 * https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 * <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
8 * option. This file may not be copied, modified, or distributed
9 * except according to those terms.
10 */
11
12pub 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}