@@ -42,6 +42,7 @@ (define-module (gnu services configuration)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-35)
+ #:use-module (srfi srfi-171)
#:export (configuration-field
configuration-field-name
configuration-field-type
@@ -59,6 +60,7 @@ (define-module (gnu services configuration)
define-configuration/no-serialization
no-serialization
+ base-transducer
serialize-configuration
define-maybe
define-maybe/no-serialization
@@ -125,13 +127,25 @@ (define-record-type* <configuration-field>
(default-value-thunk configuration-field-default-value-thunk)
(documentation configuration-field-documentation))
+(define (empty-serializer? field)
+ (eq? empty-serializer
+ (configuration-field-serializer field)))
+
+(define (base-transducer config)
+ (compose (tremove empty-serializer?)
+ ;; Only serialize fields whose value isn't '%unset-marker%.
+ (tfilter (lambda (field)
+ (let ((field-value ((configuration-field-getter field)
+ config)))
+ (maybe-value-set? field-value))))
+ (tmap (lambda (field)
+ ((configuration-field-serializer field)
+ (configuration-field-name field)
+ ((configuration-field-getter field) config))))))
+
(define (serialize-configuration config fields)
#~(string-append
- #$@(map (lambda (field)
- ((configuration-field-serializer field)
- (configuration-field-name field)
- ((configuration-field-getter field) config)))
- fields)))
+ #$@(list-transduce (base-transducer config) rcons fields)))
(define-syntax-rule (id ctx parts ...)
"Assemble PARTS into a raw (unhygienic) identifier."
@@ -337,10 +337,6 @@ (define-maybe symbol)
(define-configuration config-with-maybe-symbol
(protocol maybe-symbol ""))
-;;; Maybe symbol values are currently seen as serializable, because the
-;;; unspecified value is '%unset-marker%, which is a symbol itself.
-;;; TODO: Remove expected fail marker after resolution.
-(test-expect-fail 1)
(test-equal "symbol maybe value serialization, unspecified"
""
(gexp->approximate-sexp