diff options
Diffstat (limited to 'src/state')
| -rw-r--r-- | src/state/mod.rs | 47 | ||||
| -rw-r--r-- | src/state/threads.rs | 114 |
2 files changed, 0 insertions, 161 deletions
diff --git a/src/state/mod.rs b/src/state/mod.rs deleted file mode 100644 index 0fe9f40..0000000 --- a/src/state/mod.rs +++ /dev/null @@ -1,47 +0,0 @@ -mod threads; - -use std::io::{Stdin, Write}; -use termion::event::Key; -use termion::input::TermRead; - -pub use threads::Threads; - -pub struct Client { - states: Vec<State>, -} - -impl Client { - pub fn new(initial_state: State) -> Self { - Self { - states: vec![initial_state], - } - } - - pub fn run<W: Write>(mut self, mut screen: W, stdin: Stdin) { - for c in stdin.keys() { - let c = c.unwrap(); - // Global keybinds - match c { - Key::Char('q') => { - self.states.pop().unwrap(); - if self.states.is_empty() { - break; - } - }, - _ => () - } - - let next_state = match self.states.last_mut().unwrap() { - State::Threads(s) => s.tick(&mut screen, c), - }; - - if let Some(next_state) = next_state { - self.states.push(next_state); - } - } - } -} - -pub enum State { - Threads(Threads), -} diff --git a/src/state/threads.rs b/src/state/threads.rs deleted file mode 100644 index be566e5..0000000 --- a/src/state/threads.rs +++ /dev/null @@ -1,114 +0,0 @@ -use crate::db; -use super::State; - -use notmuch::DatabaseMode; -use std::io::Write; -use termion::{color, event::Key}; - -pub struct Threads { - threads: Vec<Thread>, - i: usize, - - query: String, -} - -pub struct Thread { - subject: String, - authors: Vec<String>, - _id: String, - messages: Vec<String>, -} - -impl<'d, 'q> Thread { - pub fn new(thread: notmuch::Thread<'d, 'q>) -> Self { - Self { - subject: thread.subject().to_string(), - authors: thread.authors().clone(), - _id: thread.id().to_string(), - messages: thread.messages().map(|m| m.id().to_string()).collect(), - } - } - - pub fn remove_tag(&self, tag: &str) { - let db = db::open(DatabaseMode::ReadWrite).unwrap(); - for m_id in self.messages.iter() { - db - .find_message(m_id) - .unwrap() - .unwrap() - .remove_tag(tag) - .unwrap(); - } - } -} - -impl Threads { - pub fn from_query(query: String) -> Self { - let mut res = Self { - threads: Vec::new(), - i: 0, - query, - }; - res.reload(); - res - } - - pub fn reload(&mut self) { - self.threads = db::open(DatabaseMode::ReadOnly) - .unwrap() - .create_query(&self.query) - .unwrap() - .search_threads() - .unwrap() - .map(Thread::new) - .collect(); - } - - pub fn init<W: Write>(&self, out: &mut W) { - draw(&self, out); - } - - pub fn tick<W: Write>(&mut self, out: &mut W, key: Key) -> Option<State> { - match key { - Key::Char('j') => self.i += 1, - Key::Char('k') => self.i = - if self.i == 0 { - self.threads.len() - } else { - self.i - 1 - }, - Key::Char('i') => { - self.threads[self.i].remove_tag("inbox"); - } - Key::Char('s') => { - let sent = Threads::from_query(String::from("tag:sent")); - sent.init(out); - return Some(State::Threads(sent)); - } - Key::Char('r') => self.reload(), - _ => (), - } - if !self.threads.is_empty() { - self.i = self.i.rem_euclid(self.threads.len()); - } - draw(&self, out); - None - } -} - -fn draw<W: Write>(state: &Threads, out: &mut W) { - write!(out, "{}", termion::clear::All).unwrap(); - - for (i, thread) in state.threads.iter().enumerate() { - write!(out, "{}", termion::cursor::Goto(1, (i + 1) as u16)).unwrap(); - let highlight = i == state.i; - if highlight { - write!(out, "{}", color::Fg(color::Red)).unwrap(); - } - write!(out, "thread {:?}, {:?}", thread.subject, thread.authors).unwrap(); - if highlight { - write!(out, "{}", color::Fg(color::Reset)).unwrap(); - } - } - out.flush().unwrap(); -} |
