From 5e7d73e6dc6fb326d4ea3d6a8f36e0d2a00f0b88 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Sat, 18 Aug 2018 23:19:39 +0300 Subject: [PATCH] Add an EnvelopeWrapper in compose --- melib/src/mailbox/email/attachments.rs | 9 +++++---- melib/src/mailbox/email/mod.rs | 19 +++++++++++-------- ui/src/components/mail/compose.rs | 16 ++++++++++++++-- ui/src/components/mail/view/mod.rs | 16 ++++++++++++++-- ui/src/compose/mod.rs | 1 - 5 files changed, 44 insertions(+), 17 deletions(-) delete mode 100644 ui/src/compose/mod.rs diff --git a/melib/src/mailbox/email/attachments.rs b/melib/src/mailbox/email/attachments.rs index ce8d86778..165533bdd 100644 --- a/melib/src/mailbox/email/attachments.rs +++ b/melib/src/mailbox/email/attachments.rs @@ -247,10 +247,11 @@ impl fmt::Display for Attachment { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self.content_type { ContentType::MessageRfc822 => { - let wrapper = EnvelopeWrapper::new(self.bytes().to_vec()); - write!(f, "message/rfc822: {} - {} - {}", wrapper.date(), wrapper.from_to_string(), wrapper.subject()) - } - + match EnvelopeWrapper::new(self.bytes().to_vec()) { + Ok(wrapper) => write!(f, "message/rfc822: {} - {} - {}", wrapper.date(), wrapper.from_to_string(), wrapper.subject()), + Err(e) => write!(f, "{}", e), + } + }, ContentType::Unsupported { .. } => { write!(f, "Data attachment of type {}", self.mime_type()) } diff --git a/melib/src/mailbox/email/mod.rs b/melib/src/mailbox/email/mod.rs index 79f9f5d5a..691a0ca78 100644 --- a/melib/src/mailbox/email/mod.rs +++ b/melib/src/mailbox/email/mod.rs @@ -224,15 +224,18 @@ impl Deref for EnvelopeWrapper { } impl EnvelopeWrapper { - pub fn new(buffer: Vec) -> Self { - EnvelopeWrapper { - envelope: Envelope::from_bytes(&buffer).unwrap(), + pub fn new(buffer: Vec) -> Result { + Ok(EnvelopeWrapper { + envelope: Envelope::from_bytes(&buffer)?, buffer, - } + }) } pub fn update(&mut self, new_buffer: Vec) { - *self = EnvelopeWrapper::new(new_buffer); + // TODO: Propagate error. + if let Ok(e) = EnvelopeWrapper::new(new_buffer) { + *self = e; + } } pub fn envelope(&self) -> &Envelope { @@ -289,15 +292,15 @@ impl Envelope { flags: Flag::default(), } } - pub fn from_bytes(bytes: &[u8]) -> Option { + pub fn from_bytes(bytes: &[u8]) -> Result { let mut h = DefaultHasher::new(); h.write(bytes); let mut e = Envelope::new(h.finish()); let res = e.populate_headers(bytes).ok(); if res.is_some() { - return Some(e); + return Ok(e); } - None + Err(MeliError::new("Couldn't parse mail.")) } pub fn from_token(mut operation: Box, hash: u64) -> Option { let mut e = Envelope::new(hash); diff --git a/ui/src/components/mail/compose.rs b/ui/src/components/mail/compose.rs index 296d3daf7..ce9033f53 100644 --- a/ui/src/components/mail/compose.rs +++ b/ui/src/components/mail/compose.rs @@ -25,6 +25,7 @@ pub struct Composer { dirty: bool, mode: ViewMode, pager: Pager, + buffer: String, } impl Default for Composer { @@ -33,6 +34,7 @@ impl Default for Composer { dirty: true, mode: ViewMode::Overview, pager: Pager::from_str("asdfs\nfdsfds\ndsfdsfs\n\n\n\naaaaaaaaaaaaaa\nfdgfd", None), + buffer: String::new(), } } } @@ -54,6 +56,10 @@ impl Component for Composer { if self.dirty { clear_area(grid, area); } + if !self.buffer.is_empty() { + eprintln!("{:?}", EnvelopeWrapper::new(self.buffer.as_bytes().to_vec())); + + } let upper_left = upper_left!(area); let bottom_right = bottom_right!(area); @@ -109,7 +115,11 @@ impl Component for Composer { { context.input_kill(); } - let mut f = create_temp_file(&new_draft(context), None); + let mut f = if self.buffer.is_empty() { + create_temp_file(&new_draft(context), None) + } else { + create_temp_file(&self.buffer.as_bytes(), None) + }; //let mut f = Box::new(std::fs::File::create(&dir).unwrap()); // TODO: check exit status @@ -120,7 +130,9 @@ impl Component for Composer { .stdout(Stdio::inherit()) .output() .expect("failed to execute process"); - self.pager.update_from_string(f.read_to_string()); + let result = f.read_to_string(); + self.buffer = result.clone(); + self.pager.update_from_string(result); context.restore_input(); self.dirty = true; return; diff --git a/ui/src/components/mail/view/mod.rs b/ui/src/components/mail/view/mod.rs index cd6a93ce5..9e8e64430 100644 --- a/ui/src/components/mail/view/mod.rs +++ b/ui/src/components/mail/view/mod.rs @@ -388,8 +388,20 @@ impl Component for MailView { match u.content_type() { ContentType::MessageRfc822 => { self.mode = ViewMode::Subview; - let wrapper = EnvelopeWrapper::new(u.bytes().to_vec()); - self.subview = Some(Box::new(EnvelopeView::new(wrapper, None, None))); + match EnvelopeWrapper::new(u.bytes().to_vec()) { + Ok(wrapper) => { + self.subview = Some(Box::new(EnvelopeView::new(wrapper, None, None))); + }, + Err(e) => { + context.replies.push_back(UIEvent { + id: 0, + event_type: UIEventType::StatusNotification( + format!("{}", e) + ), + }); + } + } + return; }, ContentType::Text { .. } => { diff --git a/ui/src/compose/mod.rs b/ui/src/compose/mod.rs deleted file mode 100644 index 8b1378917..000000000 --- a/ui/src/compose/mod.rs +++ /dev/null @@ -1 +0,0 @@ -