diff --git a/CHANGELOG.md b/CHANGELOG.md index 499c927..2f2281c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,9 @@ jmap-client 0.3.0 ================================ +- JMAP for Sieve Scripts DRAFT-14 support. - Set timeouts using `Duration` instead of `u64`. - SetError handling of unknown properties. +- Support deserializing non-IANA registered roles. jmap-client 0.2.1 ================================ diff --git a/src/mailbox/mod.rs b/src/mailbox/mod.rs index 528e257..44c0407 100644 --- a/src/mailbox/mod.rs +++ b/src/mailbox/mod.rs @@ -113,23 +113,16 @@ pub(crate) enum ACLPatch { Set(bool), } -#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)] -#[serde(rename_all = "lowercase")] +#[derive(Debug, Clone, PartialEq, Eq, Default)] pub enum Role { - #[serde(rename = "archive", alias = "ARCHIVE")] Archive, - #[serde(rename = "drafts", alias = "DRAFTS")] Drafts, - #[serde(rename = "important", alias = "IMPORTANT")] Important, - #[serde(rename = "inbox", alias = "INBOX")] Inbox, - #[serde(rename = "junk", alias = "JUNK")] Junk, - #[serde(rename = "sent", alias = "SENT")] Sent, - #[serde(rename = "trash", alias = "TRASH")] Trash, + Other(String), #[default] None, } @@ -252,3 +245,43 @@ impl ChangesObject for Mailbox { impl ChangesObject for Mailbox { type ChangesResponse = ChangesResponse; } + +impl<'de> Deserialize<'de> for Role { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + match <&str>::deserialize(deserializer)? + .to_ascii_lowercase() + .as_str() + { + "inbox" => Ok(Role::Inbox), + "sent" => Ok(Role::Sent), + "trash" => Ok(Role::Trash), + "drafts" => Ok(Role::Drafts), + "junk" => Ok(Role::Junk), + "archive" => Ok(Role::Archive), + "important" => Ok(Role::Important), + other => Ok(Role::Other(other.to_string())), + } + } +} + +impl Serialize for Role { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + serializer.serialize_str(match self { + Role::Inbox => "inbox", + Role::Sent => "sent", + Role::Trash => "trash", + Role::Drafts => "drafts", + Role::Junk => "junk", + Role::Archive => "archive", + Role::Important => "important", + Role::Other(other) => other, + Role::None => "", + }) + } +}