use std::io::{Write, stdin, stdout}; use notmuch::Thread; use termion::color; use termion::event::Key; use termion::input::TermRead; use termion::raw::IntoRawMode; use termion::screen::AlternateScreen; struct ShowThreads<'d, 'q> { threads: Vec>, } impl<'d, 'q> ShowThreads<'d, 'q> { fn tick(self) -> State<'d, 'q> { State::ShowThreads(self) } } enum State<'d, 'q> { ShowThreads(ShowThreads<'d, 'q>), } fn main() { let stdin = stdin(); let screen = AlternateScreen::from(stdout().into_raw_mode().unwrap()); // hide the cursor let mut screen = termion::cursor::HideCursor::from(screen); // open database let db = notmuch::Database::open(&"/home/gustav/.mail", notmuch::DatabaseMode::ReadOnly).unwrap(); // get threads let query = db.create_query("tag:inbox").unwrap(); let threads = query.search_threads().unwrap().collect(); let mut state = State::ShowThreads(ShowThreads { threads }); let mut i: isize = 0; // show_threads(&mut screen, &threads, i as usize); for c in stdin.keys() { // Global keybinds match c.unwrap() { Key::Char('q') => break, _ => () } // Pass to current state state = match state { State::ShowThreads(s) => s.tick(), }; // i = i.rem_euclid(threads.len() as isize); // show_threads(&mut screen, &threads, i as usize); } } fn show_threads(stdout: &mut W, threads: &Vec, highlight: usize) { write!(stdout, "{}", termion::clear::All).unwrap(); 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(); } write!(stdout, "thread {:?}, {:?}", thread.subject(), thread.authors()).unwrap(); if highlight { write!(stdout, "{}", color::Fg(color::Reset)).unwrap(); } } stdout.flush().unwrap(); }