summaryrefslogtreecommitdiff
path: root/env
diff options
context:
space:
mode:
authorewy <ewy0@protonmail.com>2026-04-14 18:05:59 +0200
committerewy <ewy0@protonmail.com>2026-04-14 18:05:59 +0200
commit6b8c39143f8375680e260e5f8f204e4cf9031599 (patch)
tree1fa7d91150ad7d8c56c2e96b689f866f71bfc256 /env
parentcc5a07dfc115b9a4e97854501fdd26c9ebd5b8d0 (diff)
add loading of .env files
Diffstat (limited to 'env')
-rw-r--r--env/env.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/env/env.go b/env/env.go
new file mode 100644
index 0000000..1bf0bd1
--- /dev/null
+++ b/env/env.go
@@ -0,0 +1,60 @@
+package env
+
+import (
+ "github.com/joho/godotenv"
+ "io/fs"
+ "os"
+ "path/filepath"
+ "pik/flags"
+ "pik/indexers/pikdex"
+ "pik/model"
+ "pik/spool"
+ "slices"
+)
+
+func IsEnv(file string) bool {
+ options := []string{
+ ".env",
+ }
+ for _, e := range *flags.Env {
+ options = append(options,
+ ".env-"+e,
+ ".env."+e,
+ e+".env")
+ }
+ return slices.Contains(options, file)
+}
+
+func EnvFiles(f fs.FS, p string, deep bool) []string {
+ var result []string
+ dir, err := fs.ReadDir(f, p)
+ if err != nil {
+ return nil
+ }
+ for _, e := range dir {
+ if e.IsDir() && slices.Contains(pikdex.Roots, e.Name()) && deep {
+ result = append(result, EnvFiles(f, e.Name(), false)...)
+ }
+ if !e.IsDir() && IsEnv(e.Name()) {
+ result = append(result, filepath.Join(p, e.Name()))
+ }
+ }
+ return result
+}
+
+func Get(src *model.Source) []string {
+ f := os.DirFS(src.Path)
+ var result []string
+ files := EnvFiles(f, ".", true)
+ for _, f := range files {
+ res, err := godotenv.Read(filepath.Join(src.Path, f))
+ if err != nil {
+ spool.Warn("%v", err)
+ continue
+ }
+ for k, v := range res {
+ result = append(result, k+"="+v)
+ }
+ }
+ return result
+}