aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--todo.go2
-rw-r--r--todolist/app.go6
-rw-r--r--todolist/file_store.go25
3 files changed, 25 insertions, 8 deletions
diff --git a/todo.go b/todo.go
index b7d453e..45d5425 100644
--- a/todo.go
+++ b/todo.go
@@ -122,5 +122,7 @@ func routeInput(command string, input string) {
app.ArchiveCompleted()
case "e", "edit":
app.EditTodoDue(input)
+ case "init":
+ app.InitializeRepo()
}
}
diff --git a/todolist/app.go b/todolist/app.go
index 0d3ce95..7d3ccb2 100644
--- a/todolist/app.go
+++ b/todolist/app.go
@@ -13,10 +13,14 @@ type App struct {
func NewApp() *App {
app := &App{TodoStore: NewFileStore()}
- app.TodoStore.Load()
return app
}
+func (a *App) InitializeRepo() {
+ a.TodoStore.Initialize()
+ fmt.Println("Todo repo initialized.")
+}
+
func (a *App) AddTodo(input string) {
parser := &Parser{}
todo := parser.ParseNewTodo(input)
diff --git a/todolist/file_store.go b/todolist/file_store.go
index a6f68b6..f8e3a71 100644
--- a/todolist/file_store.go
+++ b/todolist/file_store.go
@@ -5,26 +5,27 @@ import (
"fmt"
"io/ioutil"
"os"
- "os/user"
"sort"
)
type FileStore struct {
FileLocation string
Data []*Todo
+ Loaded bool
}
func NewFileStore() *FileStore {
- usr, _ := user.Current()
- return &FileStore{FileLocation: usr.HomeDir + "/.todos.json"}
+ return &FileStore{FileLocation: ".todos.json", Loaded: false}
}
func (f *FileStore) Add(todo *Todo) {
+ f.Load()
todo.Id = f.NextId()
f.Data = append(f.Data, todo)
}
func (f *FileStore) FindById(id int) *Todo {
+ f.Load()
for _, todo := range f.Data {
if todo.Id == id {
return todo
@@ -34,6 +35,7 @@ func (f *FileStore) FindById(id int) *Todo {
}
func (f *FileStore) Delete(id int) {
+ f.Load()
i := -1
for index, todo := range f.Data {
if todo.Id == id {
@@ -45,6 +47,7 @@ func (f *FileStore) Delete(id int) {
}
func (f *FileStore) Complete(id int) {
+ f.Load()
todo := f.FindById(id)
todo.Completed = true
f.Delete(id)
@@ -52,6 +55,7 @@ func (f *FileStore) Complete(id int) {
}
func (f *FileStore) Uncomplete(id int) {
+ f.Load()
todo := f.FindById(id)
todo.Completed = false
f.Delete(id)
@@ -59,6 +63,7 @@ func (f *FileStore) Uncomplete(id int) {
}
func (f *FileStore) Archive(id int) {
+ f.Load()
todo := f.FindById(id)
todo.Archived = true
f.Delete(id)
@@ -66,6 +71,7 @@ func (f *FileStore) Archive(id int) {
}
func (f *FileStore) Unarchive(id int) {
+ f.Load()
todo := f.FindById(id)
todo.Archived = false
f.Delete(id)
@@ -82,12 +88,15 @@ func (f *FileStore) IndexOf(todoToFind *Todo) int {
}
func (f *FileStore) Load() {
+ if f.Loaded {
+ return
+ }
+
data, err := ioutil.ReadFile(f.FileLocation)
if err != nil {
- fmt.Println("No todo file found at ~/.todos.json!")
- fmt.Println("Initializing new todo repo at ~/.todos.json")
- f.Initialize()
- return
+ fmt.Println("No todo file found!")
+ fmt.Println("Initialize a new todo repo by running 'todo init'")
+ os.Exit(0)
}
jerr := json.Unmarshal(data, &f.Data)
@@ -95,6 +104,7 @@ func (f *FileStore) Load() {
fmt.Println("Error reading json data", jerr)
os.Exit(1)
}
+ f.Loaded = true
}
func (f *FileStore) Initialize() {
@@ -121,6 +131,7 @@ func (a ByDate) Less(i, j int) bool {
}
func (f *FileStore) Todos() []*Todo {
+ f.Load()
sort.Sort(ByDate(f.Data))
return f.Data
}