use alloc::{
string::{String, ToString},
vec::Vec,
};
use core::fmt;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JmapMailbox {
pub id: Option<String>,
pub name: Option<String>,
pub parent_id: Option<String>,
pub role: Option<JmapMailboxRole>,
#[serde(default)]
pub sort_order: u32,
#[serde(default)]
pub total_emails: u32,
#[serde(default)]
pub unread_emails: u32,
#[serde(default)]
pub total_threads: u32,
#[serde(default)]
pub unread_threads: u32,
#[serde(default)]
pub my_rights: JmapMailboxRights,
#[serde(default)]
pub is_subscribed: bool,
}
#[derive(Clone, Debug, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct JmapMailboxCreate {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<JmapMailboxRole>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_order: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_subscribed: Option<bool>,
}
#[derive(Clone, Debug, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct JmapMailboxUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<JmapMailboxRole>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sort_order: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_subscribed: Option<bool>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JmapMailboxRights {
pub may_read_items: bool,
pub may_add_items: bool,
pub may_remove_items: bool,
pub may_set_seen: bool,
pub may_set_keywords: bool,
pub may_create_child: bool,
pub may_rename: bool,
pub may_delete: bool,
pub may_submit: bool,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum JmapMailboxRole {
Inbox,
Archive,
Drafts,
Flagged,
Important,
Junk,
Sent,
Subscribed,
Trash,
Other(String),
}
impl fmt::Display for JmapMailboxRole {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(match self {
Self::Inbox => "inbox",
Self::Archive => "archive",
Self::Drafts => "drafts",
Self::Flagged => "flagged",
Self::Important => "important",
Self::Junk => "junk",
Self::Sent => "sent",
Self::Subscribed => "subscribed",
Self::Trash => "trash",
Self::Other(s) => s.as_str(),
})
}
}
impl Serialize for JmapMailboxRole {
fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
s.serialize_str(&self.to_string())
}
}
impl<'de> Deserialize<'de> for JmapMailboxRole {
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
let s = String::deserialize(d)?;
Ok(match s.as_str() {
"inbox" => Self::Inbox,
"archive" => Self::Archive,
"drafts" => Self::Drafts,
"flagged" => Self::Flagged,
"important" => Self::Important,
"junk" => Self::Junk,
"sent" => Self::Sent,
"subscribed" => Self::Subscribed,
"trash" => Self::Trash,
_ => Self::Other(s),
})
}
}
#[derive(Clone, Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum JmapMailboxProperty {
Id,
Name,
ParentId,
Role,
SortOrder,
TotalEmails,
UnreadEmails,
TotalThreads,
UnreadThreads,
MyRights,
IsSubscribed,
}
#[derive(Clone, Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum JmapMailboxSortProperty {
Name,
SortOrder,
ParentId,
}
#[derive(Clone, Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct JmapMailboxSortComparator {
pub property: JmapMailboxSortProperty,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_ascending: Option<bool>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JmapMailboxFilter {
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<JmapMailboxRole>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_subscribed: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_any_role: Option<bool>,
}
#[derive(Clone, Debug, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum JmapMailboxSetItemError {
MailboxHasChild {
description: Option<String>,
},
MailboxHasEmail {
description: Option<String>,
},
NotFound {
description: Option<String>,
},
InvalidPatch {
description: Option<String>,
},
WillDestroy {
description: Option<String>,
},
InvalidProperties {
description: Option<String>,
#[serde(default)]
properties: Vec<String>,
},
Singleton {
description: Option<String>,
},
#[serde(other)]
Unknown,
}