melib/backends: MailBackend::refresh() returns Result

Handle cases were refresh() would fail properly. Fixes a crash reported in #13
async
Manos Pitsidianakis 2019-12-15 08:52:22 +02:00
parent 17a0f31b3e
commit 0201241786
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
4 changed files with 16 additions and 9 deletions

View File

@ -252,8 +252,8 @@ pub trait MailBackend: ::std::fmt::Debug + Send + Sync {
&mut self, &mut self,
folder_hash: FolderHash, folder_hash: FolderHash,
sender: RefreshEventConsumer, sender: RefreshEventConsumer,
) -> Async<Result<Vec<RefreshEvent>>> { ) -> Result<Async<Result<Vec<RefreshEvent>>>> {
unimplemented!() Err(MeliError::new("Unimplemented."))
} }
fn watch( fn watch(
&self, &self,

View File

@ -203,7 +203,7 @@ impl MailBackend for MaildirType {
&mut self, &mut self,
folder_hash: FolderHash, folder_hash: FolderHash,
sender: RefreshEventConsumer, sender: RefreshEventConsumer,
) -> Async<Result<Vec<RefreshEvent>>> { ) -> Result<Async<Result<Vec<RefreshEvent>>>> {
let w = AsyncBuilder::new(); let w = AsyncBuilder::new();
let cache_dir = xdg::BaseDirectories::with_profile("meli", &self.name).unwrap(); let cache_dir = xdg::BaseDirectories::with_profile("meli", &self.name).unwrap();
@ -327,7 +327,7 @@ impl MailBackend for MaildirType {
} }
}) })
}; };
w.build(handle) Ok(w.build(handle))
} }
fn watch( fn watch(
&self, &self,

View File

@ -676,10 +676,16 @@ impl Component for Listing {
UIEvent::Input(ref key) UIEvent::Input(ref key)
if shortcut!(key == shortcuts[Listing::DESCRIPTION]["refresh"]) => if shortcut!(key == shortcuts[Listing::DESCRIPTION]["refresh"]) =>
{ {
let folder_hash =
context.accounts[self.cursor_pos.0].folders_order[self.cursor_pos.1];
let account = &mut context.accounts[self.cursor_pos.0]; let account = &mut context.accounts[self.cursor_pos.0];
account.refresh(folder_hash); if let Some(&folder_hash) = account.folders_order.get(self.cursor_pos.1) {
if let Err(err) = account.refresh(folder_hash) {
context.replies.push_back(UIEvent::Notification(
Some("Could not refresh.".to_string()),
err.to_string(),
Some(NotificationType::INFO),
));
}
}
return true; return true;
} }
UIEvent::StartupCheck(_) => { UIEvent::StartupCheck(_) => {

View File

@ -699,13 +699,14 @@ impl Account {
} }
None None
} }
pub fn refresh(&mut self, folder_hash: FolderHash) { pub fn refresh(&mut self, folder_hash: FolderHash) -> Result<()> {
let sender_ = self.sender.clone(); let sender_ = self.sender.clone();
let r = RefreshEventConsumer::new(Box::new(move |r| { let r = RefreshEventConsumer::new(Box::new(move |r| {
sender_.send(ThreadEvent::from(r)).unwrap(); sender_.send(ThreadEvent::from(r)).unwrap();
})); }));
let mut h = self.backend.write().unwrap().refresh(folder_hash, r); let mut h = self.backend.write().unwrap().refresh(folder_hash, r)?;
self.work_context.new_work.send(h.work().unwrap()).unwrap(); self.work_context.new_work.send(h.work().unwrap()).unwrap();
Ok(())
} }
pub fn watch(&self) { pub fn watch(&self) {
if self.settings.account().manual_refresh { if self.settings.account().manual_refresh {