Add an EnvelopeWrapper in compose

embed
Manos Pitsidianakis 2018-08-18 23:19:39 +03:00
parent d146c81d48
commit 5e7d73e6dc
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
5 changed files with 44 additions and 17 deletions

View File

@ -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())
}

View File

@ -224,15 +224,18 @@ impl Deref for EnvelopeWrapper {
}
impl EnvelopeWrapper {
pub fn new(buffer: Vec<u8>) -> Self {
EnvelopeWrapper {
envelope: Envelope::from_bytes(&buffer).unwrap(),
pub fn new(buffer: Vec<u8>) -> Result<Self> {
Ok(EnvelopeWrapper {
envelope: Envelope::from_bytes(&buffer)?,
buffer,
}
})
}
pub fn update(&mut self, new_buffer: Vec<u8>) {
*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<Envelope> {
pub fn from_bytes(bytes: &[u8]) -> Result<Envelope> {
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<BackendOp>, hash: u64) -> Option<Envelope> {
let mut e = Envelope::new(hash);

View File

@ -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;

View File

@ -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 { .. } => {

View File

@ -1 +0,0 @@