From b6ea375485083860094a904b7a6c7d97fa42b8f8 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 10 Jul 2020 22:35:30 +0530 Subject: follow XDG_DATA_DIR spec for app data --- src/app.rs | 38 +++++++++++++++++++++++++------------- src/utils.rs | 12 ++++++++++++ 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/app.rs b/src/app.rs index e322091..82096e1 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,5 +1,5 @@ use std::f64; -use std::fs::File; +use std::fs::{File, OpenOptions}; use std::io::prelude::*; use cursive::direction::{Absolute, Direction}; @@ -10,6 +10,7 @@ use cursive::{Printer, Vec2}; use chrono::{Local, NaiveDate}; use crate::habit::{Bit, Count, Habit, HabitWrapper}; +use crate::utils; use crate::Command; use crate::CONFIGURATION; @@ -173,10 +174,26 @@ impl App { } pub fn load_state() -> Self { - let mut file = File::open("foo.txt").unwrap(); - let mut j = String::new(); - file.read_to_string(&mut j); - return serde_json::from_str(&j).unwrap(); + let data_file = utils::data_file(); + if let Ok(ref mut file) = File::open(data_file) { + let mut j = String::new(); + file.read_to_string(&mut j); + return serde_json::from_str(&j).unwrap(); + } else { + Self::new() + } + } + + // this function does IO + // TODO: convert this into non-blocking async function + fn save_state(&self) { + let j = serde_json::to_string_pretty(&self).unwrap(); + let data_file = utils::data_file(); + + match OpenOptions::new().write(true).create(true).open(data_file) { + Ok(ref mut file) => file.write_all(j.as_bytes()).unwrap(), + Err(_) => panic!("Unable to write!"), + }; } pub fn parse_command(&mut self, input: &str) { @@ -201,14 +218,6 @@ impl App { } } } - - // this function does IO - // TODO: convert this into non-blocking async function - fn save_state(&self) { - let j = serde_json::to_string_pretty(&self).unwrap(); - let mut file = File::create("foo.txt").unwrap(); - file.write_all(j.as_bytes()).unwrap(); - } } impl View for App { @@ -313,6 +322,9 @@ impl View for App { * before performing any action, "refocusing" the cursor * */ _ => { + if self.habits.is_empty() { + return EventResult::Ignored; + } self.set_view_month_offset(0); self.habits[self.focus].on_event(e) } diff --git a/src/utils.rs b/src/utils.rs index 55900b0..ab7e7ef 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,4 +1,6 @@ use cursive::theme::{BaseColor, Color}; +use directories::ProjectDirs; +use std::path::{Path, PathBuf}; pub struct AppConfig { pub true_chr: char, @@ -30,3 +32,13 @@ pub fn load_configuration_file() -> AppConfig { future_color: Color::Light(BaseColor::Black), }; } + +pub fn data_file() -> PathBuf { + if let Some(proj_dirs) = ProjectDirs::from("rs", "nerdypepper", "dijo") { + let mut data_file = PathBuf::from(proj_dirs.data_dir()); + data_file.push("habit_record.json"); + return data_file; + } else { + panic!("Invalid home directory!") + }; +} -- cgit v1.2.3