diff options
-rw-r--r-- | deepenv.scm | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/deepenv.scm b/deepenv.scm index fb7bae2..ae0b3c3 100644 --- a/deepenv.scm +++ b/deepenv.scm @@ -5,6 +5,7 @@ (chicken io) (chicken string) (chicken process-context) + srfi-1 srfi-13 srfi-14) @@ -27,10 +28,13 @@ (define (load-dir-.env dir) "Load a .env file present in `.dir` and return its environment definitions as a alist" - (with-input-from-file ".env" - (lambda () (read-list (current-input-port) read-env-line)))) + (let ((.env-file (conc dir "/.env"))) + (if (file-exists? .env-file) + (with-input-from-file .env-file + (lambda () (read-list (current-input-port) read-env-line))) + '()))) -(define (path-parents path) +(define (path-parts path) (call-with-values (lambda () (decompose-directory path)) (lambda (origin base elts) @@ -40,8 +44,21 @@ (cons base elts) elts))))) +(define (path-parents path) + (fold (lambda (item acc) + (if (> (length acc) 0) + (if (string=? (car acc) "/") + (cons (conc "/" item) acc) + (cons (conc (car acc) "/" item) acc)) + (list item))) + '() + (path-parts path))) +(define (.env-union alist2 alist1) + (lset-union (lambda (a b) (string=? (car a) (car b))) + alist2 alist1)) -(let ((path-hierarchy (path-parents (current-directory)))) - path-hierarchy) +(let ((parents (path-parents (current-directory)))) + (fold .env-union '() + (reverse (map load-dir-.env parents)))) |