diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-10-29 04:09:42 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-10-29 04:11:49 +0900 |
| commit | a52f7038e5a607dd0901244abb791c96deaf9c2d (patch) | |
| tree | 2184b7313cf3b2d783778e8272ac22d0eaa1603f /internal/env/env.go | |
| parent | 274686d10d3386a41f8fb6bc3363269a734afe0e (diff) | |
internal/env: relocate from app
This package is much cleaner to stub independently, and makes no sense to lump into app.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/env/env.go')
| -rw-r--r-- | internal/env/env.go | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/internal/env/env.go b/internal/env/env.go new file mode 100644 index 00000000..ebb816d6 --- /dev/null +++ b/internal/env/env.go @@ -0,0 +1,66 @@ +// Package env provides the [Paths] struct for efficiently building paths from the environment. +package env + +import ( + "log" + "os" + "strconv" + + "hakurei.app/container/check" + "hakurei.app/hst" +) + +// Paths holds paths copied from the environment and is used to create [hst.Paths]. +type Paths struct { + // TempDir is returned by [os.TempDir]. + TempDir *check.Absolute + // RuntimePath is copied from $XDG_RUNTIME_DIR. + RuntimePath *check.Absolute +} + +// Copy expands [Paths] into [hst.Paths]. +func (env *Paths) Copy(v *hst.Paths, userid int) { + if env == nil || env.TempDir == nil || v == nil { + panic("attempting to use an invalid Paths") + } + + v.TempDir = env.TempDir + v.SharePath = env.TempDir.Append("hakurei." + strconv.Itoa(userid)) + + if env.RuntimePath == nil { + // fall back to path in share since hakurei has no hard XDG dependency + v.RunDirPath = v.SharePath.Append("run") + v.RuntimePath = v.RunDirPath.Append("compat") + } else { + v.RuntimePath = env.RuntimePath + v.RunDirPath = env.RuntimePath.Append("hakurei") + } +} + +// CopyPaths returns a populated [Paths]. +func CopyPaths() *Paths { return CopyPathsFunc(log.Fatalf, os.TempDir, os.Getenv) } + +// CopyPathsFunc returns a populated [Paths], +// using the provided [log.Fatalf], [os.TempDir], [os.Getenv] functions. +func CopyPathsFunc( + fatalf func(format string, v ...any), + tempdir func() string, + getenv func(key string) string, +) *Paths { + const xdgRuntimeDir = "XDG_RUNTIME_DIR" + + var env Paths + + if tempDir, err := check.NewAbs(tempdir()); err != nil { + fatalf("invalid TMPDIR: %v", err) + panic("unreachable") + } else { + env.TempDir = tempDir + } + + if a, err := check.NewAbs(getenv(xdgRuntimeDir)); err == nil { + env.RuntimePath = a + } + + return &env +} |
