diff --git a/pttodo/root.go b/pttodo/root.go index 6886111..1c0689c 100644 --- a/pttodo/root.go +++ b/pttodo/root.go @@ -1,11 +1,41 @@ package pttodo +import ( + "os" + + yaml "gopkg.in/yaml.v2" +) + type Root struct { Todo []Todo Scheduled []Todo Done []Todo } +func VerifyRootFromFile(p string) error { + _, err := NewRootFromFile(p) + return err +} + +func NewRootFromFile(p string) (Root, error) { + f, err := os.Open(p) + if os.IsNotExist(err) { + return Root{}, nil + } + if err != nil { + return Root{}, err + } + defer f.Close() + + var result Root + if err := yaml.NewDecoder(f).Decode(&result); err != nil { + return Root{}, err + } + + result.AutoMove() + return result, nil +} + func (root Root) Equals(other Root) bool { for i, slice := range [][2][]Todo{ [2][]Todo{root.Todo, other.Todo}, diff --git a/pttodo/todo.go b/pttodo/todo.go index 1fe9ad6..bbe4805 100644 --- a/pttodo/todo.go +++ b/pttodo/todo.go @@ -4,7 +4,10 @@ import ( "encoding/base64" "fmt" "hash/crc32" + "os" "time" + + yaml "gopkg.in/yaml.v2" ) type Todo struct { @@ -17,6 +20,24 @@ type Todo struct { writeTS bool } +func NewTodosFromFile(p string) ([]Todo, error) { + f, err := os.Open(p) + if os.IsNotExist(err) { + return nil, nil + } + if err != nil { + return nil, err + } + defer f.Close() + + var result []Todo + if err := yaml.NewDecoder(f).Decode(&result); err != nil { + return nil, err + } + + return result, nil +} + func (todo Todo) ID() string { hash := crc32.NewIEEE() fmt.Fprintf(hash, "%d:%s", 0, todo.Todo)