summaryrefslogtreecommitdiff
path: root/internal/timer/timer.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/timer/timer.go')
-rw-r--r--internal/timer/timer.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/internal/timer/timer.go b/internal/timer/timer.go
new file mode 100644
index 0000000..3f2e3f5
--- /dev/null
+++ b/internal/timer/timer.go
@@ -0,0 +1,65 @@
+package timer
+
+import (
+ "encoding/json"
+ "os"
+ "path/filepath"
+ "time"
+)
+
+const (
+ stateFile = ".timr_state"
+)
+
+// stateFilePathOverride is used by tests to override the state file path.
+var stateFilePathOverride string
+
+type State struct {
+ StartTime time.Time
+ ElapsedTime time.Duration
+ Running bool
+}
+
+func GetStateFile() (string, error) {
+ if stateFilePathOverride != "" {
+ return stateFilePathOverride, nil
+ }
+ configDir, err := os.UserConfigDir()
+ if err != nil {
+ return "", err
+ }
+ return filepath.Join(configDir, "timr", stateFile), nil
+}
+
+func LoadState() (State, error) {
+ var state State
+ stateFilePath, err := GetStateFile()
+ if err != nil {
+ return state, err
+ }
+
+ data, err := os.ReadFile(stateFilePath)
+ if err != nil {
+ if os.IsNotExist(err) {
+ return State{}, nil
+ }
+ return state, err
+ }
+
+ err = json.Unmarshal(data, &state)
+ return state, err
+}
+
+func (s *State) Save() error {
+ data, err := json.Marshal(s)
+ if err != nil {
+ return err
+ }
+
+ stateFilePath, err := GetStateFile()
+ if err != nil {
+ return err
+ }
+
+ return os.WriteFile(stateFilePath, data, 0644)
+}