diff --git a/main.go b/main.go index 284b1a6..a2bbb38 100644 --- a/main.go +++ b/main.go @@ -19,6 +19,7 @@ type ( LastAnswer(string, string) (string, Answer) Answer(string) Answer PushAnswer(string, string, string, bool) error + Close() } Question struct { Q string @@ -49,6 +50,7 @@ func Main() error { if err != nil { return err } + defer db.Close() user := os.Getenv("USER") for q, _ := range db.HistoryOf(user) { if time.Until(db.Next(user, q)) > 0 { diff --git a/yamldb.go b/yamldb.go index 86e3ebc..263c344 100644 --- a/yamldb.go +++ b/yamldb.go @@ -10,6 +10,7 @@ import ( type ( yamlDB struct { + addr string Knowledge knowledge Users map[string]user Cadence []duration @@ -29,6 +30,7 @@ type ( func newYamlDB(p string) (yamlDB, error) { db := yamlDB{ + addr: p, Knowledge: knowledge{ Questions: map[string]Question{}, Answers: map[string]Answer{}, @@ -44,6 +46,22 @@ func newYamlDB(p string) (yamlDB, error) { return db, nil } +func (db yamlDB) Close() { + if os.Getenv("W") == "" { + return + } + b, err := yaml.Marshal(db) + if err != nil { + panic(err) + } + if err := os.Rename(db.addr, db.addr+".bak"); err != nil { + panic(err) + } + if err := os.WriteFile(db.addr, b, os.ModePerm); err != nil { + panic(err) + } +} + func (db yamlDB) HistoryOf(user string) map[string][]History { result := map[string][]History{} for k, v := range db.Users[user].History {