From 6ee9465d43269cd1b1c9016e9989e0bc86f9b4df Mon Sep 17 00:00:00 2001 From: Dmitry Bogatov Date: Wed, 18 Sep 2019 15:13:56 +0000 Subject: [PATCH] Make return type of Image::mv an enum Replace named constants with enum to improve type-safety and make exhausiveness checks possible. Note, that since this enum never pass FFI border, its numeric values does not need to be specified explicitly and can be left on compiler's discretion. --- src/imap.rs | 28 ++++++++++++++++++---------- src/job.rs | 10 +++++----- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/imap.rs b/src/imap.rs index 2f648e4d5..52458cdcc 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -19,6 +19,14 @@ use crate::param::Params; const DC_IMAP_SEEN: usize = 0x0001; +#[derive(Debug, Display, Clone, Copy, PartialEq, Eq)] +pub enum ImapResult { + Failed, + RetryLater, + AlreadyDone, + Success, +} + pub const DC_SUCCESS: usize = 3; pub const DC_ALREADY_DONE: usize = 2; pub const DC_RETRY_LATER: usize = 1; @@ -1130,12 +1138,12 @@ impl Imap { uid: u32, dest_folder: S2, dest_uid: &mut u32, - ) -> usize { - let mut res = DC_RETRY_LATER; + ) -> ImapResult { + let mut res = ImapResult::RetryLater; let set = format!("{}", uid); if uid == 0 { - res = DC_FAILED; + res = ImapResult::Failed; } else if folder.as_ref() == dest_folder.as_ref() { info!( context, @@ -1145,7 +1153,7 @@ impl Imap { dest_folder.as_ref() ); - res = DC_ALREADY_DONE; + res = ImapResult::AlreadyDone; } else { info!( context, @@ -1165,7 +1173,7 @@ impl Imap { let moved = if let Some(ref mut session) = &mut *self.session.lock().unwrap() { match session.uid_mv(&set, &dest_folder) { Ok(_) => { - res = DC_SUCCESS; + res = ImapResult::Success; true } Err(err) => { @@ -1205,22 +1213,22 @@ impl Imap { warn!(context, "Cannot mark message as \"Deleted\".",); } self.config.write().unwrap().selected_folder_needs_expunge = true; - res = DC_SUCCESS; + res = ImapResult::Success; } } } } - if res == DC_SUCCESS { + if res == ImapResult::Success { // TODO: is this correct? *dest_uid = uid; } - if res == DC_RETRY_LATER { + if res == ImapResult::RetryLater { if self.should_reconnect() { - DC_RETRY_LATER + ImapResult::RetryLater } else { - DC_FAILED + ImapResult::Failed } } else { res diff --git a/src/job.rs b/src/job.rs index 28d1b3569..6b570fa0d 100644 --- a/src/job.rs +++ b/src/job.rs @@ -247,13 +247,13 @@ impl Job { &dest_folder, &mut dest_uid, ) { - DC_RETRY_LATER => { + ImapResult::RetryLater => { self.try_again_later(3i32, None); } - DC_SUCCESS => { + ImapResult::Success => { dc_update_server_uid(context, &msg.rfc724_mid, &dest_folder, dest_uid); } - DC_FAILED | DC_ALREADY_DONE | _ => {} + ImapResult::Failed | ImapResult::AlreadyDone => {} } } } @@ -401,8 +401,8 @@ impl Job { } let dest_folder = context.sql.get_config(context, "configured_mvbox_folder"); if let Some(dest_folder) = dest_folder { - if 1 == inbox.mv(context, folder, uid, dest_folder, &mut dest_uid) - as libc::c_uint + if ImapResult::RetryLater + == inbox.mv(context, folder, uid, dest_folder, &mut dest_uid) { self.try_again_later(3, None); }