summaryrefslogtreecommitdiff
path: root/internal/config
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-02 17:52:13 +0300
committerPaul Buetow <paul@buetow.org>2026-04-02 17:52:13 +0300
commit11a3e62f17433a7df0e6a77a688321d94a736778 (patch)
treeada0f94c074a3e290ea993179fbf645a40d7ab48 /internal/config
parentf3d057fec20aeef584cb6340c6a002280a019f15 (diff)
task 003: handle home-dir and APKG marshal errors
Diffstat (limited to 'internal/config')
-rw-r--r--internal/config/home.go22
-rw-r--r--internal/config/home_test.go25
2 files changed, 47 insertions, 0 deletions
diff --git a/internal/config/home.go b/internal/config/home.go
new file mode 100644
index 0000000..8089b6e
--- /dev/null
+++ b/internal/config/home.go
@@ -0,0 +1,22 @@
+package config
+
+import (
+ "fmt"
+ "os"
+)
+
+var userHomeDir = os.UserHomeDir
+
+// HomeDir returns the user's home directory.
+//
+// It falls back to "." when the home directory cannot be resolved so callers
+// can still build a safe relative path instead of joining against an empty
+// string.
+func HomeDir() (string, error) {
+ homeDir, err := userHomeDir()
+ if err != nil {
+ return ".", fmt.Errorf("resolve home directory: %w", err)
+ }
+
+ return homeDir, nil
+}
diff --git a/internal/config/home_test.go b/internal/config/home_test.go
new file mode 100644
index 0000000..bc7f5ea
--- /dev/null
+++ b/internal/config/home_test.go
@@ -0,0 +1,25 @@
+package config
+
+import (
+ "errors"
+ "testing"
+)
+
+func TestHomeDirReturnsFallbackWhenResolutionFails(t *testing.T) {
+ oldUserHomeDir := userHomeDir
+ t.Cleanup(func() {
+ userHomeDir = oldUserHomeDir
+ })
+
+ userHomeDir = func() (string, error) {
+ return "", errors.New("boom")
+ }
+
+ homeDir, err := HomeDir()
+ if err == nil {
+ t.Fatal("HomeDir() error = nil, want error")
+ }
+ if homeDir != "." {
+ t.Fatalf("HomeDir() homeDir = %q, want %q", homeDir, ".")
+ }
+}