diff --git a/melib/src/mailbox/backends.rs b/melib/src/mailbox/backends.rs index 66f6fb52..b401da34 100644 --- a/melib/src/mailbox/backends.rs +++ b/melib/src/mailbox/backends.rs @@ -150,6 +150,8 @@ pub trait MailBackend: ::std::fmt::Debug { fn watch(&self, sender: RefreshEventConsumer) -> Result<()>; fn folders(&self) -> Vec; fn operation(&self, hash: EnvelopeHash, folder_hash: FolderHash) -> Box; + + fn save(&self, message: String, folder: &str) -> Result<()>; //login function } diff --git a/melib/src/mailbox/backends/maildir/backend.rs b/melib/src/mailbox/backends/maildir/backend.rs index 54db6baa..c52f0542 100644 --- a/melib/src/mailbox/backends/maildir/backend.rs +++ b/melib/src/mailbox/backends/maildir/backend.rs @@ -27,7 +27,7 @@ extern crate xdg; use super::{MaildirFolder, MaildirOp}; use async::*; use conf::AccountSettings; -use error::Result; +use error::{Result, MeliError}; use mailbox::backends::{ BackendFolder, BackendOp, Folder, FolderHash, MailBackend, RefreshEvent, RefreshEventConsumer, RefreshEventKind::*, @@ -49,6 +49,7 @@ use std::ffi::OsStr; use std::fs; use std::hash::{Hash, Hasher}; use std::io; +use std::io::Write; use std::ops::{Deref, DerefMut}; use std::path::{Component, Path, PathBuf}; use std::result; @@ -327,9 +328,27 @@ impl MailBackend for MaildirType { })?; Ok(()) } + fn operation(&self, hash: EnvelopeHash, folder_hash: FolderHash) -> Box { Box::new(MaildirOp::new(hash, self.hash_indexes.clone(), folder_hash)) } + + fn save(&self, message: String, folder: &str) -> Result<()> { + for f in &self.folders { + if f.name == folder { + let mut path = f.path.clone(); + path.push("cur"); + path.push("draft:2,"); + eprintln!("saving at {}", path.display()); + let file = fs::File::create(path)?; + let mut writer = io::BufWriter::new(file); + writer.write(&message.into_bytes()); + return Ok(()); + } + } + + Err(MeliError::new(format!("'{}' is not a valid folder.", folder))) + } } impl MaildirType { diff --git a/ui/src/components/mail/compose.rs b/ui/src/components/mail/compose.rs index 6cf7e3d0..e68d7fc0 100644 --- a/ui/src/components/mail/compose.rs +++ b/ui/src/components/mail/compose.rs @@ -401,7 +401,11 @@ impl Component for Composer { } ('n', _) => {}, ('y', ViewMode::Discard(u)) => { - eprintln!("{:?}", self.draft.to_string()); + let account = &context.accounts[self.account_cursor]; + let draft = std::mem::replace(&mut self.draft, Draft::default()); + eprintln!("{:?}", account.save_draft(draft)); + + //eprintln!("{:?}", self.draft.to_string()); context.replies.push_back(UIEvent { id: 0, event_type: UIEventType::Action(Tab(Kill(*u))), diff --git a/ui/src/conf.rs b/ui/src/conf.rs index 781e9cc3..b10dd2ae 100644 --- a/ui/src/conf.rs +++ b/ui/src/conf.rs @@ -60,6 +60,7 @@ pub struct FileAccount { root_folder: String, format: String, sent_folder: String, + draft_folder: String, identity: String, display_name: Option, threaded: bool, diff --git a/ui/src/conf/accounts.rs b/ui/src/conf/accounts.rs index 271f966f..da7ac043 100644 --- a/ui/src/conf/accounts.rs +++ b/ui/src/conf/accounts.rs @@ -299,6 +299,10 @@ impl Account { self.load_mailbox(index, m); Ok(()) } + + pub fn save_draft(&self, draft: Draft) -> Result<()> { + self.backend.save(draft.to_string()?, &self.settings.conf.draft_folder) + } } impl Index for Account {