aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs59
1 files changed, 16 insertions, 43 deletions
diff --git a/src/main.rs b/src/main.rs
index 1aa4922..7d29d72 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,25 +1,14 @@
-use std::io::{Write, stdin, stdout};
-use notmuch::Thread;
-use termion::color;
+mod state;
+
+use crate::state::State;
+use crate::state::Threads;
+
+use std::io::{stdin, stdout};
use termion::event::Key;
use termion::input::TermRead;
use termion::raw::IntoRawMode;
use termion::screen::AlternateScreen;
-struct ShowThreads<'d, 'q> {
- threads: Vec<Thread<'d, 'q>>,
-}
-
-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());
@@ -34,42 +23,26 @@ fn main() {
let query = db.create_query("tag:inbox").unwrap();
let threads = query.search_threads().unwrap().collect();
- let mut state = State::ShowThreads(ShowThreads {
- threads
- });
+ // init initial state
+ let mut threads = Threads {
+ threads,
+ i: 0,
+ };
+ threads.init(&mut screen);
- let mut i: isize = 0;
- // show_threads(&mut screen, &threads, i as usize);
+ let mut state = State::Threads(threads);
for c in stdin.keys() {
+ let c = c.unwrap();
// Global keybinds
- match c.unwrap() {
+ match c {
Key::Char('q') => break,
_ => ()
}
// Pass to current state
state = match state {
- State::ShowThreads(s) => s.tick(),
+ State::Threads(s) => s.tick(&mut screen, c),
};
- // i = i.rem_euclid(threads.len() as isize);
- // show_threads(&mut screen, &threads, i as usize);
- }
-}
-
-fn show_threads<W: Write>(stdout: &mut W, threads: &Vec<Thread>, 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();
}