;; SPDX-License-Identifier: GPL-3.0-only ;; SPDX-FileCopyrightText: Copyright (C) 2023 by sterni (in-package :config) (eval-when (:compile-toplevel :load-toplevel) (defun plist-to-alist (lst) (loop for (name . (default . (parser . nil))) on lst by #'cdddr collect (cons name (list default parser)))) (defun symbol-to-env-var-name (symbol) (concatenate 'string "MBLOG_" (string-upcase (remove #\* (substitute #\_ #\- (string symbol))))))) (defmacro define-configuration-variables (&rest args) (let ((vars (plist-to-alist args)) (val-var-sym (gensym))) `(progn ,@(loop for (name . (default nil)) in vars collect `(defvar ,name ,default)) (defun init-from-env () ,@(loop for (name . (nil parser)) in vars collect `(when-let ((,val-var-sym (getenv ,(symbol-to-env-var-name name)))) (setf ,name (funcall ,parser ,val-var-sym)))))))) (define-configuration-variables *general-buffer-size* (min 4096 qbase64:+max-bytes-length+) #'parse-integer)