guix-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[bug#63985] [PATCH RFC 2/5] services: configuration: Use transducers wit


From: Bruno Victal
Subject: [bug#63985] [PATCH RFC 2/5] services: configuration: Use transducers within serialize-configuration.
Date: Fri, 9 Jun 2023 22:20:57 +0100

Introduces 'base-transducer', a SRFI-171 based transducer that can be used as a
starting point for writing custom configuration record serializing procedures.

This also fixes the symbol maybe-value serialization test case.

* gnu/services/configuration.scm (empty-serializer?): New predicate.
(base-transducer): New procedure.
(serialize-configuration): Adapt to use base-transducer.
* tests/services/configuration.scm: Remove test-expect-fail.
---
 gnu/services/configuration.scm   | 24 +++++++++++++++++++-----
 tests/services/configuration.scm |  4 ----
 2 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/gnu/services/configuration.scm b/gnu/services/configuration.scm
index dafe72f4fe..0818b48bb5 100644
--- a/gnu/services/configuration.scm
+++ b/gnu/services/configuration.scm
@@ -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."
diff --git a/tests/services/configuration.scm b/tests/services/configuration.scm
index 8ad5907f37..1db83bb273 100644
--- a/tests/services/configuration.scm
+++ b/tests/services/configuration.scm
@@ -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
-- 
2.39.2






reply via email to

[Prev in Thread] Current Thread [Next in Thread]