From 469d338d5da0cb8c3996614b42677428abbb9aaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20B=C3=B8cker-Larsen?= Date: Thu, 17 Dec 2020 00:20:48 +0800 Subject: [PATCH] refactor: combine all append_* + introduce AppendOptions --- src/client.rs | 54 ++++++++++++++++++--------------------- tests/imap_integration.rs | 25 ++++++++++++++---- 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/src/client.rs b/src/client.rs index 26a1432..167ea70 100644 --- a/src/client.rs +++ b/src/client.rs @@ -84,6 +84,15 @@ pub struct Connection { pub greeting_read: bool, } +/// A set of options for the append command +#[derive(Default)] +pub struct AppendOptions<'a> { + /// Optional list of flags + pub flags: Option<&'a [Flag<'a>]>, + /// Optional internal date + pub date: Option>, +} + // `Deref` instances are so we can make use of the same underlying primitives in `Client` and // `Session` impl Deref for Client { @@ -1078,10 +1087,9 @@ impl Session { /// Specifically, the server will generally notify the client immediately via an untagged /// `EXISTS` response. If the server does not do so, the client MAY issue a `NOOP` command (or /// failing that, a `CHECK` command) after one or more `APPEND` commands. - pub fn append, B: AsRef<[u8]>>(&mut self, mailbox: S, content: B) -> Result<()> { - self.append_with_flags(mailbox, content, &[]) - } - + /// + /// -- TODO merge docs possibly move to AppendOptions + /// /// The [`APPEND` command](https://tools.ietf.org/html/rfc3501#section-6.3.11) can take /// an optional FLAGS parameter to set the flags on the new message. /// @@ -1092,48 +1100,36 @@ impl Session { /// /// The [`\Recent` flag](https://tools.ietf.org/html/rfc3501#section-2.3.2) is not /// allowed as an argument to `APPEND` and will be filtered out if present in `flags`. - pub fn append_with_flags, B: AsRef<[u8]>>( - &mut self, - mailbox: S, - content: B, - flags: &[Flag<'_>], - ) -> Result<()> { - self.append_with_flags_and_date(mailbox, content, flags, None) - } - - /// The [`APPEND` command](https://tools.ietf.org/html/rfc3501#section-6.3.11) can take - /// an optional FLAGS parameter to set the flags on the new message. /// - /// > If a flag parenthesized list is specified, the flags SHOULD be set - /// > in the resulting message; otherwise, the flag list of the - /// > resulting message is set to empty by default. In either case, the - /// > Recent flag is also set. - /// - /// The [`\Recent` flag](https://tools.ietf.org/html/rfc3501#section-2.3.2) is not - /// allowed as an argument to `APPEND` and will be filtered out if present in `flags`. + /// -- TODO merge docs possibly move to AppendOptions /// /// Pass a date in order to set the date that the message was originally sent. /// /// > If a date-time is specified, the internal date SHOULD be set in /// > the resulting message; otherwise, the internal date of the /// > resulting message is set to the current date and time by default. - pub fn append_with_flags_and_date, B: AsRef<[u8]>>( + pub fn append<'a, S: AsRef, B: AsRef<[u8]>>( &mut self, mailbox: S, content: B, - flags: &[Flag<'_>], - date: impl Into>>, + options: impl Into>>, ) -> Result<()> { let content = content.as_ref(); - let flagstr = flags + let options_ = options.into().unwrap_or(AppendOptions::default()); + + let flagstr = options_ + .flags + .unwrap_or(&[]) .iter() .filter(|f| **f != Flag::Recent) .map(|f| f.to_string()) .collect::>() .join(" "); - let datestr = match date.into() { - Some(date) => format!(" \"{}\"", date.format("%d-%h-%Y %T %z")), - None => "".to_string(), + + let datestr = if let Some(date) = options_.date { + format!(" \"{}\"", date.format("%d-%h-%Y %T %z")) + } else { + "".to_string() }; self.run_command(&format!( diff --git a/tests/imap_integration.rs b/tests/imap_integration.rs index b37f3f3..18dd3e8 100644 --- a/tests/imap_integration.rs +++ b/tests/imap_integration.rs @@ -253,7 +253,8 @@ fn append() { let mbox = "INBOX"; c.select(mbox).unwrap(); //append - c.append(mbox, e.message_to_string().unwrap()).unwrap(); + c.append(mbox, e.message_to_string().unwrap(), None) + .unwrap(); // now we should see the e-mail! let inbox = c.uid_search("ALL").unwrap(); @@ -301,8 +302,15 @@ fn append_with_flags() { c.select(mbox).unwrap(); //append let flags: &[Flag] = &[Flag::Seen, Flag::Flagged]; - c.append_with_flags(mbox, e.message_to_string().unwrap(), flags) - .unwrap(); + c.append( + mbox, + e.message_to_string().unwrap(), + imap::AppendOptions { + flags: Some(flags), + date: None, + }, + ) + .unwrap(); // now we should see the e-mail! let inbox = c.uid_search("ALL").unwrap(); @@ -358,8 +366,15 @@ fn append_with_flags_and_date() { let date = FixedOffset::east(8 * 3600) .ymd(2020, 12, 13) .and_hms(13, 36, 36); - c.append_with_flags_and_date(mbox, e.message_to_string().unwrap(), flags, Some(date)) - .unwrap(); + c.append( + mbox, + e.message_to_string().unwrap(), + imap::AppendOptions { + flags: Some(flags), + date: Some(date), + }, + ) + .unwrap(); // now we should see the e-mail! let inbox = c.uid_search("ALL").unwrap();