aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2020-03-31 16:46:02 +0200
committerHugo Hörnquist <hugo@lysator.liu.se>2020-03-31 16:46:02 +0200
commit35a413167e323f8b0c9ea40fe7599ffb50e9e321 (patch)
tree9b00917547b4a3e756aab29543fbb6574e0f7788
parentFix IPv6 binding for server. (diff)
downloadcalp-35a413167e323f8b0c9ea40fe7599ffb50e9e321.tar.gz
calp-35a413167e323f8b0c9ea40fe7599ffb50e9e321.tar.xz
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.
-rw-r--r--config.scm10
-rw-r--r--module/datetime/util.scm7
-rw-r--r--module/entry-points/benchmark.scm2
-rw-r--r--module/entry-points/html.scm2
-rw-r--r--module/entry-points/ical.scm2
-rw-r--r--module/entry-points/server.scm2
-rw-r--r--module/entry-points/terminal.scm2
-rwxr-xr-xmodule/main.scm2
-rw-r--r--module/output/html.scm12
-rw-r--r--module/output/terminal.scm2
-rw-r--r--module/parameters.scm33
-rw-r--r--module/util/config.scm30
-rw-r--r--module/util/config/all.scm3
-rw-r--r--module/vcomponent/load.scm3
14 files changed, 66 insertions, 46 deletions
diff --git a/config.scm b/config.scm
index 9b56b471..832cad23 100644
--- a/config.scm
+++ b/config.scm
@@ -4,13 +4,15 @@
(use-modules (vcomponent))
-(use-modules (srfi srfi-26)
- (srfi srfi-88)
+(use-modules (srfi srfi-88)
(ice-9 regex)
- (ice-9 rdelim)
+ ;; (ice-9 rdelim)
(sxml simple)
(glob)
- (datetime util))
+ (datetime util)
+
+ (util config all)
+ )
(calendar-files (glob "~/.local/var/cal/*"))
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<?)))
+(register-config! calendar-files '() (ensure list?))
;; Reads all calendar files from disk, generate recurence-sets for all repeating events,
;; and returns a list of calendars, and a stream of all events "ready" for display.