diff --git a/src/todolist.rs b/src/todolist.rs index dba3ee1..774985a 100644 --- a/src/todolist.rs +++ b/src/todolist.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; use serde_json::from_reader; use std::fs::File; -use std::io::{BufReader, Write}; +use std::io::BufReader; pub struct TodoList { // We use owned strings here because they’re easier to manipulate when editing. @@ -25,19 +25,17 @@ impl Todo { } } -const JSON_PATH: &str = "tracc.json"; - -fn read_todos() -> Option> { - File::open(JSON_PATH) +fn read_todos(path: &str) -> Option> { + File::open(path) .ok() .map(|f| BufReader::new(f)) .and_then(|r| from_reader(r).ok()) } impl TodoList { - pub fn open_or_create() -> Self { + pub fn open_or_create(path: &str) -> Self { TodoList { - todos: read_todos().unwrap_or(vec![Todo::new("This is a list entry")]), + todos: read_todos(path).unwrap_or(vec![Todo::new("This is a list entry")]), selected: 0, register: None, } @@ -99,16 +97,4 @@ impl TodoList { pub fn current_pop(&mut self) { self.todos[self.selected].text.pop(); } - - pub fn persist(&self) { - let string = serde_json::to_string(&self.todos).unwrap(); - std::fs::OpenOptions::new() - .create(true) - .write(true) - .truncate(true) - .open(JSON_PATH) - .ok() - .or_else(|| panic!("Can’t save todos to JSON. Dumping raw data:\n{}", string)) - .map(|mut f| f.write(string.as_bytes())); - } } diff --git a/src/tracc.rs b/src/tracc.rs index a32692a..40e4434 100644 --- a/src/tracc.rs +++ b/src/tracc.rs @@ -1,6 +1,6 @@ use super::todolist::TodoList; use std::default::Default; -use std::io; +use std::io::{self,Write}; use termion::event::Key; use termion::input::TermRead; use tui::backend::TermionBackend; @@ -8,6 +8,7 @@ use tui::style::{Color, Style}; use tui::widgets::*; type Terminal = tui::Terminal>>; +const JSON_PATH: &str = "tracc.json"; pub enum Mode { Insert, @@ -23,7 +24,7 @@ pub struct Tracc { impl Tracc { pub fn new(terminal: Terminal) -> Self { Self { - todos: TodoList::open_or_create(), + todos: TodoList::open_or_create(JSON_PATH), terminal, input_mode: Mode::Normal, } @@ -37,11 +38,7 @@ impl Tracc { let input = inputs.next().unwrap()?; match self.input_mode { Mode::Normal => match input { - Key::Char('q') => { - self.todos.persist(); - self.terminal.clear()?; - break; - } + Key::Char('q') => break, Key::Char('j') => self.todos.selection_down(), Key::Char('k') => self.todos.selection_up(), Key::Char('o') => { @@ -71,6 +68,8 @@ impl Tracc { }, }; } + self.terminal.clear()?; + persist_todos(&self.todos, JSON_PATH); Ok(()) } @@ -101,3 +100,15 @@ fn refresh(terminal: &mut Terminal, todos: &TodoList) -> Result<(), io::Error> { })?; Ok(()) } + +fn persist_todos(todos: &TodoList, path: &str) { + let string = serde_json::to_string(&todos.todos).unwrap(); + std::fs::OpenOptions::new() + .create(true) + .write(true) + .truncate(true) + .open(path) + .ok() + .or_else(|| panic!("Can’t save todos to JSON. Dumping raw data:\n{}", string)) + .map(|mut f| f.write(string.as_bytes())); +}