async_imap/types/
quota.rs1use imap_proto::types::Quota as QuotaRef;
2use imap_proto::types::QuotaResource as QuotaResourceRef;
3use imap_proto::types::QuotaResourceName as QuotaResourceNameRef;
4use imap_proto::types::QuotaRoot as QuotaRootRef;
5
6#[derive(Debug, Eq, PartialEq, Hash, Clone)]
8pub enum QuotaResourceName {
9 Storage,
11 Message,
13 Atom(String),
15}
16
17impl From<QuotaResourceNameRef<'_>> for QuotaResourceName {
18 fn from(name: QuotaResourceNameRef<'_>) -> Self {
19 match name {
20 QuotaResourceNameRef::Message => QuotaResourceName::Message,
21 QuotaResourceNameRef::Storage => QuotaResourceName::Storage,
22 QuotaResourceNameRef::Atom(v) => QuotaResourceName::Atom(v.to_string()),
23 }
24 }
25}
26
27#[derive(Debug, Eq, PartialEq, Hash, Clone)]
29pub struct QuotaResource {
30 pub name: QuotaResourceName,
32 pub usage: u64,
34 pub limit: u64,
36}
37
38impl From<QuotaResourceRef<'_>> for QuotaResource {
39 fn from(resource: QuotaResourceRef<'_>) -> Self {
40 Self {
41 name: resource.name.into(),
42 usage: resource.usage,
43 limit: resource.limit,
44 }
45 }
46}
47
48impl QuotaResource {
49 pub fn get_usage_percentage(&self) -> u64 {
51 self.usage
52 .saturating_mul(100)
53 .checked_div(self.limit)
54 .unwrap_or(0)
56 }
57}
58
59#[derive(Debug, Eq, PartialEq, Hash, Clone)]
61pub struct Quota {
62 pub root_name: String,
64 pub resources: Vec<QuotaResource>,
66}
67
68impl From<QuotaRef<'_>> for Quota {
69 fn from(quota: QuotaRef<'_>) -> Self {
70 Self {
71 root_name: quota.root_name.to_string(),
72 resources: quota.resources.iter().map(|r| r.clone().into()).collect(),
73 }
74 }
75}
76
77#[derive(Debug, Eq, PartialEq, Hash, Clone)]
79pub struct QuotaRoot {
80 pub mailbox_name: String,
82 pub quota_root_names: Vec<String>,
84}
85
86impl From<QuotaRootRef<'_>> for QuotaRoot {
87 fn from(root: QuotaRootRef<'_>) -> Self {
88 Self {
89 mailbox_name: root.mailbox_name.to_string(),
90 quota_root_names: root
91 .quota_root_names
92 .iter()
93 .map(|n| n.to_string())
94 .collect(),
95 }
96 }
97}