diff options
author | Manos Pitsidianakis <el13635@mail.ntua.gr> | 2019-08-26 20:04:02 +0300 |
---|---|---|
committer | Manos Pitsidianakis <el13635@mail.ntua.gr> | 2019-09-15 13:21:14 +0300 |
commit | 525bd1649316c3f0abc5234cd4470fa124712289 (patch) | |
tree | 6e60010ff330b35ce16a7a6180df9b18ec7226ac | |
parent | c9f7b41e4720b2aef0c68f5c6e3361a859c1f4e3 (diff) |
imap: add folder operations in backend
-rw-r--r-- | melib/src/backends/imap.rs | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index 7307336c..3ecee812 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -36,7 +36,7 @@ use crate::backends::BackendOp; use crate::backends::FolderHash; use crate::backends::RefreshEvent; use crate::backends::RefreshEventKind::{self, *}; -use crate::backends::{BackendFolder, Folder, MailBackend, RefreshEventConsumer}; +use crate::backends::{BackendFolder, Folder, FolderOperation, MailBackend, RefreshEventConsumer}; use crate::conf::AccountSettings; use crate::email::*; use crate::error::{MeliError, Result}; @@ -525,6 +525,58 @@ impl MailBackend for ImapType { conn.read_response(&mut response)?; Ok(()) } + + fn folder_operation(&mut self, path: &str, op: FolderOperation) -> Result<()> { + use FolderOperation::*; + + match (&op, self.folders.values().any(|f| f.path == path)) { + (Create, true) => { + return Err(MeliError::new(format!( + "Folder named `{}` in account `{}` already exists.", + path, self.account_name, + ))); + } + (op, false) if *op != Create => { + return Err(MeliError::new(format!( + "No folder named `{}` in account `{}`", + path, self.account_name, + ))); + } + _ => {} + } + + let mut response = String::with_capacity(8 * 1024); + match op { + Create => { + let mut conn = self.connection.lock()?; + conn.send_command(format!("CREATE \"{}\"", path,).as_bytes())?; + conn.read_response(&mut response)?; + conn.send_command(format!("SUBSCRIBE \"{}\"", path,).as_bytes())?; + conn.read_response(&mut response)?; + } + Rename(dest) => { + let mut conn = self.connection.lock()?; + conn.send_command(format!("RENAME \"{}\" \"{}\"", path, dest).as_bytes())?; + conn.read_response(&mut response)?; + } + Delete => { + let mut conn = self.connection.lock()?; + conn.send_command(format!("DELETE \"{}\"", path,).as_bytes())?; + conn.read_response(&mut response)?; + } + Subscribe => { + let mut conn = self.connection.lock()?; + conn.send_command(format!("SUBSCRIBE \"{}\"", path,).as_bytes())?; + conn.read_response(&mut response)?; + } + Unsubscribe => { + let mut conn = self.connection.lock()?; + conn.send_command(format!("UNSUBSCRIBE \"{}\"", path,).as_bytes())?; + conn.read_response(&mut response)?; + } + } + Ok(()) + } } fn lookup_ipv4(host: &str, port: u16) -> Result<SocketAddr> { |