diff --git a/src/mail/client.rs b/src/mail/client.rs index 7a28fc1..88ac866 100644 --- a/src/mail/client.rs +++ b/src/mail/client.rs @@ -130,7 +130,8 @@ pub async fn sync_main( .unwrap(); while let Some((uid, attrs)) = message_list.next().await { let evt = MailEvent::UpdateUid(acct_name.clone(), uid, attrs); - mail2ui_tx.send(evt); + // TODO: probably odn't care about this? + let _ = mail2ui_tx.send(evt); } // check if IDLE is supported diff --git a/src/mail/store.rs b/src/mail/store.rs index 4131a0d..d9737c5 100644 --- a/src/mail/store.rs +++ b/src/mail/store.rs @@ -63,10 +63,9 @@ pub enum MailStoreUpdate { impl MailStore { /// Creates a new MailStore - pub fn new(mut config_watcher: ConfigWatcher) -> Self { + pub fn new(config_watcher: ConfigWatcher) -> Self { let config = Arc::new(RwLock::new(None)); let config2 = config.clone(); - let inner = Arc::new(RwLock::new(None)); let inner2 = inner.clone(); @@ -74,35 +73,14 @@ impl MailStore { let store_out_tx = Arc::new(store_out_tx); let store_out_tx2 = store_out_tx.clone(); - let listener = async move { - while let Ok(()) = config_watcher.changed().await { - let new_config = config_watcher.borrow().clone(); - - let fut = future::try_join( - async { - let mut write = config2.write().await; - write.replace(new_config.clone()); - Ok::<_, Error>(()) - }, - async { - let new_inner = - MailStoreInner::init_with_config(new_config.clone()).await?; - let mut write = inner2.write().await; - write.replace(new_inner); - Ok(()) - }, - ); - - match fut.await { - Ok(_) => store_out_tx2.send(Some(MailStoreUpdate::AccountListUpdate(()))), - Err(e) => { - error!("during mail loop: {}", e); - panic!(); - } - }; + let handle = tokio::spawn(async move { + match mail_store_config_listener(config_watcher, config2, inner2, store_out_tx2).await { + Ok(_) => {} + Err(e) => { + error!("mail store listener error: {}", e); + } } - }; - let handle = tokio::spawn(listener); + }); MailStore { config, @@ -297,6 +275,41 @@ impl MailStore { } } +async fn mail_store_config_listener( + mut config_watcher: ConfigWatcher, + config: Arc>>, + inner: Arc>>, + store_out_tx: Arc>>, +) -> Result<()> { + while let Ok(()) = config_watcher.changed().await { + let new_config = config_watcher.borrow().clone(); + + let fut = future::try_join( + async { + let mut write = config.write().await; + write.replace(new_config.clone()); + Ok::<_, Error>(()) + }, + async { + let new_inner = MailStoreInner::init_with_config(new_config.clone()).await?; + let mut write = inner.write().await; + write.replace(new_inner); + Ok(()) + }, + ); + + match fut.await { + Ok(_) => store_out_tx.send(Some(MailStoreUpdate::AccountListUpdate(())))?, + Err(e) => { + error!("during mail loop: {}", e); + panic!(); + } + }; + } + + Ok(()) +} + impl MailStoreInner { async fn init_with_config(config: Config) -> Result { let data_dir = config.data_dir.to_string_lossy(); diff --git a/src/script.rs b/src/script.rs index dac2537..5a3e4e3 100644 --- a/src/script.rs +++ b/src/script.rs @@ -3,7 +3,7 @@ use anyhow::Result; use gluon::{import::add_extern_module, ThreadExt}; -use crate::ui::{UiCommand, UiUpdate}; +// use crate::ui::{UiCommand, UiUpdate}; /// Creates a VM for running scripts pub async fn create_script_vm() -> Result<()> { diff --git a/src/search.rs b/src/search.rs index dfc40d5..9e1e305 100644 --- a/src/search.rs +++ b/src/search.rs @@ -10,5 +10,7 @@ pub struct SearchIndex {} impl SearchIndex { /// Create a new instance of the search index - pub fn new(config: Config) {} + pub fn new(config: Config) -> Self { + SearchIndex {} + } } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 4350d9d..26c2ca4 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -2,9 +2,9 @@ mod colon_prompt; mod input; -mod keybinds; +// mod keybinds; mod mail_view; -mod messages; +// mod messages; mod windows; use std::any::Any; @@ -45,7 +45,7 @@ use crate::mail::{EmailMetadata, MailEvent, MailStore}; use self::colon_prompt::ColonPrompt; use self::input::{BaseInputHandler, HandlesInput, InputResult}; use self::mail_view::MailView; -pub(crate) use self::messages::*; +// pub(crate) use self::messages::*; use self::windows::*; pub(crate) type FrameType<'a, 'b> = Frame<'a, &'b mut Stdout>; @@ -115,7 +115,7 @@ pub async fn run_ui2(params: UiParams) -> Result<()> { // got an event from the ui thread evt = ui_events.next().fuse() => if let Some(evt) = evt { let evt = evt?; - ui.process_event(evt)?; + ui.process_event(evt); } // wait for approx 60fps @@ -169,7 +169,7 @@ impl UI { .cloned() .unwrap_or_else(|| i.to_string()) }) - .map(|s| Spans::from(s)) + .map(Spans::from) .collect(); let tabs = Tabs::new(titles).style(Style::default().bg(Color::DarkGray)); f.render_widget(tabs, chunks[1]); @@ -196,7 +196,7 @@ impl UI { } /// Main entrypoint for handling any kind of event coming from the terminal - fn process_event(&mut self, evt: Event) -> Result<()> { + fn process_event(&mut self, evt: Event) { if let Event::Key(evt) = evt { if let KeyEvent { code: KeyCode::Char('q'), @@ -208,7 +208,7 @@ impl UI { // handle states in the state stack // although this is written in a for loop, every case except one should break - // let mut should_pop = false; + let should_pop = false; // for input_state in input_states.iter_mut().rev() { // match input_state.handle_key(&mut term, evt)? { // InputResult::Ok => break, @@ -223,12 +223,11 @@ impl UI { // } // } - // if should_pop { - // input_states.pop(); - // } + if should_pop { + debug!("pop state"); + // input_states.pop(); + } } - - Ok(()) } async fn process_mail_event(&mut self, evt: MailEvent) -> Result<()> { diff --git a/src/ui/windows.rs b/src/ui/windows.rs index 882a28c..9180875 100644 --- a/src/ui/windows.rs +++ b/src/ui/windows.rs @@ -53,7 +53,7 @@ impl WindowLayout { self.page_order.push(pid); self.ids.insert(id, pid); - if let None = self.currently_active { + if self.currently_active.is_none() { self.currently_active = Some(id); } @@ -93,10 +93,7 @@ struct PageGraph { } #[derive(Debug)] -enum Dir { - H, - V, -} +enum Dir {} impl PageGraph { pub fn new(id: LayoutId) -> Self {