services: configuration: Allow disabling serialization.

Serialization is not always useful, for example when deriving command line
arguments from a configuration.  This change provides a way to turn it off,
which removes the need to define a bunch of dummy serialization procedures.

Credit goes to Andrew Gierth (RhodiumToad) from #guile for providing the
solution.  Thank you!

* gnu/services/configuration.scm (define-configuration-helper): New procedure.
(define-configuration) <no-serialization>: New syntactic keyword.  Use it in a
new pattern.  Refactor the macro so that it makes use of the above helper
procedure.
This commit is contained in:
Maxim Cournoyer 2021-05-07 21:46:51 -04:00
parent 1a2704add3
commit 3f9a12dc08
No known key found for this signature in database
GPG key ID: 1260E46482E63562

View file

@ -116,9 +116,8 @@ (define (maybe-stem? val)
(define (serialize-maybe-stem field-name val)
(if (stem? val) (serialize-stem field-name val) ""))))))))
(define-syntax define-configuration
(lambda (stx)
(syntax-case stx ()
(define (define-configuration-helper serialize? syn)
(syntax-case syn ()
((_ stem (field (field-type def ...) doc) ...)
(with-syntax (((field-getter ...)
(map (lambda (field)
@ -139,7 +138,9 @@ (define-syntax define-configuration
#'((field-type def ...) ...)))
((field-serializer ...)
(map (lambda (type)
(id #'stem #'serialize- type))
(if serialize?
(id #'stem #'serialize- type)
#f))
#'(field-type ...))))
#`(begin
(define-record-type* #,(id #'stem #'< #'stem #'>)
@ -178,7 +179,17 @@ (define-syntax-rule (stem arg (... ...))
(let ((conf (#,(id #'stem #'% #'stem) arg (... ...))))
(validate-configuration conf
#,(id #'stem #'stem #'-fields))
conf))))))))
conf)))))))
(define-syntax define-configuration
(lambda (s)
(syntax-case s (no-serialization)
((_ stem (field (field-type def ...) doc) ... (no-serialization))
(define-configuration-helper
#f #'(_ stem (field (field-type def ...) doc) ...)))
((_ stem (field (field-type def ...) doc) ...)
(define-configuration-helper
#t #'(_ stem (field (field-type def ...) doc) ...))))))
(define (serialize-package field-name val)
"")