use hash-table for storing env-data - no override slots!

This commit is contained in:
Helmut Merz 2024-06-07 12:06:49 +02:00
parent 966a56037e
commit ebd7275b8a
3 changed files with 16 additions and 17 deletions

View file

@ -5,12 +5,12 @@
(defpackage :scopes/config
(:use :common-lisp)
(:export #:base
#:override-keys #:env-prefix #:env-path))
#:env-data #:env-keys #:env-prefix #:env-path))
(in-package :scopes/config)
(defclass base ()
((override-keys :reader override-keys
((env-keys :reader env-keys
:initform nil
:allocation :class)
(env-prefix :reader env-prefix
@ -18,17 +18,19 @@
:initform "SCOPES_")
(env-path :reader env-path
:initarg :env-path
:initform nil)))
:initform nil)
(env-data :accessor env-data
:initform (make-hash-table))))
(defmethod initialize-instance :after ((cfg base) &key &allow-other-keys)
(let* ((prefix (env-prefix cfg))
(let* ((data (env-data cfg))
(prefix (env-prefix cfg))
(ep (env-path cfg))
(dotenv-data (if ep (dotenv:read-env ep))))
(dolist (sl (override-keys cfg))
(dolist (sl (env-keys cfg))
(let* ((key (str:concat prefix (string sl)))
(env-val (uiop:getenv key))
(dotenv-val (if dotenv-data (gethash key dotenv-data))))
(if env-val
(setf (slot-value cfg sl) env-val)
(if dotenv-val
(setf (slot-value cfg sl) dotenv-val)))))))
(setf (gethash sl data) env-val)
(setf (gethash sl data) dotenv-val))))))

View file

@ -5,6 +5,4 @@
(in-package :scopes/test-config)
(setf *config*
(make-instance 'test-config
:user "default-user"
:password "public"))
(make-instance 'test-config))

View file

@ -15,10 +15,8 @@
(defvar *config* nil)
(defclass test-config (config:base)
((config:override-keys :initform '(user password))
(config:env-path :initform (t:test-path ".test.env"))
(user :initarg :user :reader user)
(password :initarg :password :reader password)))
((config:env-keys :initform '(:user :password))
(config:env-path :initform (t:test-path ".test.env"))))
(defun run ()
(let ((*config* nil)
@ -35,5 +33,6 @@
(== (pathname-name (util:home-path ".env.txt" "lisp" "cl-scopes")) ".env"))
(t:deftest test-env-override ()
(== (user *config*) "user-from-env-file")
(== (password *config*) "very_secret"))
(let ((data (config:env-data *config*)))
(== (gethash :user data) "user-from-env-file")
(== (gethash :password data) "very_secret")))