From 35a413167e323f8b0c9ea40fe7599ffb50e9e321 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Tue, 31 Mar 2020 16:46:02 +0200 Subject: Attempt at decentralized configuration system. Placing all possible configuration items in a central (parameters) module scales really badly. This idea that any module can register configuration parameters is better. The current implementation however has the drawback that it requires that the module exposing the parameter is loaded before the value can be sat, but that scales even worse. A probable solution would be to abandon binding everything to guile's module system, and instead let (util config) provide a `conf-ref' and a `conf-set!' procedures. A `define-configuration' similar to emacs `defcustom' could be of use, mainly for retroactively type checking parameters. --- module/datetime/util.scm | 7 +++++++ module/entry-points/benchmark.scm | 2 +- module/entry-points/html.scm | 2 +- module/entry-points/ical.scm | 2 +- module/entry-points/server.scm | 2 +- module/entry-points/terminal.scm | 2 +- module/main.scm | 2 +- module/output/html.scm | 12 +++++++++++- module/output/terminal.scm | 2 +- module/parameters.scm | 33 --------------------------------- module/util/config.scm | 30 ++++++++++++++++++++++++++++++ module/util/config/all.scm | 3 +++ module/vcomponent/load.scm | 3 ++- 13 files changed, 60 insertions(+), 42 deletions(-) delete mode 100644 module/parameters.scm create mode 100644 module/util/config.scm create mode 100644 module/util/config/all.scm (limited to 'module') diff --git a/module/datetime/util.scm b/module/datetime/util.scm index 0d4699c6..c567d44f 100644 --- a/module/datetime/util.scm +++ b/module/datetime/util.scm @@ -5,6 +5,7 @@ :use-module (srfi srfi-41) :use-module (srfi srfi-41 util) :use-module (util) + :use-module (util config) ) (define-public (start-of-month date) @@ -349,3 +350,9 @@ [else (day (get-date dt))]))) (+ (time->decimal-hour ((@ (datetime) get-time%) dt)) (* (1- date-diff) 24)))) + + +(register-config! + week-start + sun + (ensure (lambda (x) (<= sun x sat)))) diff --git a/module/entry-points/benchmark.scm b/module/entry-points/benchmark.scm index eff4c261..a21b4630 100644 --- a/module/entry-points/benchmark.scm +++ b/module/entry-points/benchmark.scm @@ -4,7 +4,7 @@ :use-module (ice-9 getopt-long) :use-module (util) :use-module (vcomponent) - :use-module (parameters) + :use-module (util config all) ) diff --git a/module/entry-points/html.scm b/module/entry-points/html.scm index 71a68f44..bacc8038 100644 --- a/module/entry-points/html.scm +++ b/module/entry-points/html.scm @@ -8,7 +8,7 @@ :use-module (datetime util) :use-module (ice-9 getopt-long) - :use-module (parameters) + :use-module (util config all) ) diff --git a/module/entry-points/ical.scm b/module/entry-points/ical.scm index 9f7457c3..e2ee7dcf 100644 --- a/module/entry-points/ical.scm +++ b/module/entry-points/ical.scm @@ -3,7 +3,7 @@ :use-module (util) :use-module (output ical) :use-module ((vcomponent) :select (load-calendars*)) - :use-module ((parameters) :select (calendar-files)) + :use-module ((util config all) :select (calendar-files)) :use-module (ice-9 getopt-long) :use-module (datetime) :use-module (datetime util) diff --git a/module/entry-points/server.scm b/module/entry-points/server.scm index f90afa63..e3ce168a 100644 --- a/module/entry-points/server.scm +++ b/module/entry-points/server.scm @@ -2,7 +2,7 @@ :export (main) :use-module (util) :use-module (vcomponent) - :use-module (parameters) + :use-module (util config all) ) (use-modules* (web (server request response uri)) diff --git a/module/entry-points/terminal.scm b/module/entry-points/terminal.scm index 09ae8004..0f2a85f0 100644 --- a/module/entry-points/terminal.scm +++ b/module/entry-points/terminal.scm @@ -5,7 +5,7 @@ :use-module (ice-9 getopt-long) :use-module (datetime) :use-module (datetime util) - :use-module (parameters) + :use-module (util config all) :use-module (vulgar) ) diff --git a/module/main.scm b/module/main.scm index fbf1992e..011e5f63 100755 --- a/module/main.scm +++ b/module/main.scm @@ -29,7 +29,7 @@ exec guile -e main -s $0 "$@" (statprof) - (parameters)) + (util config all)) (define options '((statprof (value optional)) diff --git a/module/output/html.scm b/module/output/html.scm index 8c7d9674..299dde3d 100644 --- a/module/output/html.scm +++ b/module/output/html.scm @@ -7,6 +7,7 @@ #:use-module (vcomponent group) #:use-module (vcomponent datetime) #:use-module (util) + #:use-module (util config) #:use-module (util tree) #:duplicates (last) #:use-module (datetime) @@ -17,9 +18,18 @@ #:use-module (git) - #:use-module (parameters) + ;; #:use-module (module config all) ) +(register-config! + summary-filter + (lambda (_ a) a) + (ensure procedure?)) + +(register-config! + description-filter + (lambda (_ a) a) + (ensure procedure?)) (define (date-link date) (date->string date "~Y-~m-~d")) diff --git a/module/output/terminal.scm b/module/output/terminal.scm index cb18649d..c344776f 100644 --- a/module/output/terminal.scm +++ b/module/output/terminal.scm @@ -19,7 +19,7 @@ #:use-module (vcomponent datetime) #:use-module (ice-9 format) - #:use-module (parameters) + ;; #:use-module (parameters) #:export (main-loop)) diff --git a/module/parameters.scm b/module/parameters.scm deleted file mode 100644 index d58c6333..00000000 --- a/module/parameters.scm +++ /dev/null @@ -1,33 +0,0 @@ -;;; Commentary: - -;; This file should define all global configurable variables which -;; doesn't belong anywhere else. The config module should then import -;; this module, and set all configs as needed. The config module -;; should also be able to set configs gotten from other parts. - -;;; Code: - -(define-module (parameters)) - -(define (ensure pred?) - (lambda (v) - (unless (pred? v) - (error (format #f "Value [~s] doesn't satisfy condition ~a" - v (or (procedure-name pred?) "")))) - v)) - -(define-public calendar-files - (make-parameter - '() (ensure list?))) - -(define-public summary-filter - (make-parameter (lambda (_ a) a) (ensure procedure?))) - -;; ev x str -> sxml -(define-public description-filter - (make-parameter (lambda (_ a) a) (ensure procedure?))) - -(use-modules (datetime util)) - -(define-public week-start - (make-parameter sun (ensure (lambda (x) (<= sun x sat))))) diff --git a/module/util/config.scm b/module/util/config.scm new file mode 100644 index 00000000..46c0bf99 --- /dev/null +++ b/module/util/config.scm @@ -0,0 +1,30 @@ +;;; Commentary: + +;; This file should define all global configurable variables which +;; doesn't belong anywhere else. The config module should then import +;; this module, and set all configs as needed. The config module +;; should also be able to set configs gotten from other parts. + +;;; Code: + +(define-module (util config) + :export (register-config!) + ) + +(define-public (ensure pred?) + (lambda (v) + (unless (pred? v) + (error (format #f "Value [~s] doesn't satisfy condition ~a" + v (or (procedure-name pred?) "")))) + v)) + +(define-macro (register-config! name default-value valid-value?) + `(save-module-excursion + (lambda () + (define mod (resolve-module '(util config all))) + (set-current-module mod) + (module-define! mod (quote ,name) + (make-parameter ,default-value + ,valid-value?)) + (export ,name)) + )) diff --git a/module/util/config/all.scm b/module/util/config/all.scm new file mode 100644 index 00000000..984b1d68 --- /dev/null +++ b/module/util/config/all.scm @@ -0,0 +1,3 @@ +(define-module (util config all) + :use-module (util config)) + diff --git a/module/vcomponent/load.scm b/module/vcomponent/load.scm index e3e6f192..d4324437 100644 --- a/module/vcomponent/load.scm +++ b/module/vcomponent/load.scm @@ -7,13 +7,14 @@ :use-module (datetime util) :use-module (srfi srfi-41) :use-module (srfi srfi-41 util) - :use-module (parameters) + ;; :use-module (parameters) ;; :use-module (vcomponent) :use-module (vcomponent base) :use-module ((vcomponent parse) :select (parse-cal-path)) :use-module ((vcomponent recurrence) :select (generate-recurrence-set repeating?)) :use-module ((vcomponent datetime) :select (ev-time