diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs index 1b30c67..ea7830c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,52 @@ +use std::io::{Stdout, Write, stdin, stdout}; +use termion::color; +use termion::event::Key; +use termion::input::TermRead; +use termion::raw::{IntoRawMode, RawTerminal}; + fn main() { + let stdin = stdin(); + let mut stdout = stdout().into_raw_mode().unwrap(); + + // open database let db = notmuch::Database::open(&"/home/gustav/.mail", notmuch::DatabaseMode::ReadOnly).unwrap(); - let query = db.create_query("tag:inbox and tag:unread").unwrap(); + + // get threads + let query = db.create_query("tag:inbox").unwrap(); let threads = query.search_threads().unwrap(); + let threads = threads + .map(|t| format!("thread {:?}, {:?}", + t.subject(), + t.authors())) + .collect(); + + let mut i: isize = 0; + show_threads(&mut stdout, &threads, i as usize); + + for c in stdin.keys() { + match c.unwrap() { + Key::Char('j') => i += 1, + Key::Char('k') => i -= 1, + Key::Char('q') => break, + _ => () + } + i = i.rem_euclid(threads.len() as isize); + show_threads(&mut stdout, &threads, i as usize); + } +} + +fn show_threads(stdout: &mut RawTerminal<Stdout>, threads: &Vec<String>, highlight: usize) { + write!(stdout, "{}", termion::clear::All).unwrap(); - for thread in threads { - println!("thread {:?}, {:?}", thread.subject(), thread.authors()); + for (i, thread) in threads.iter().enumerate() { + write!(stdout, "{}", termion::cursor::Goto(1, (i + 1) as u16)).unwrap(); + let highlight = highlight == i; + if highlight { + write!(stdout, "{}", color::Fg(color::Red)).unwrap(); + } + writeln!(stdout, "{}", thread).unwrap(); + if highlight { + write!(stdout, "{}", color::Fg(color::Reset)).unwrap(); + } } } |
