summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndrew Tropin <andrew@trop.in>2021-08-31 15:40:07 +0300
committerOleg Pykhalov <go.wigust@gmail.com>2021-09-09 20:26:51 +0300
commit3087a5cfa05b682564c78a0f79a0d49ef6f9b31a (patch)
tree9feb202af74486ad68e47f025523e44c5a93936c
parent879abff4fd70afbc5d3c491f145489c3e8738741 (diff)
downloadguix-3087a5cfa05b682564c78a0f79a0d49ef6f9b31a.tar.gz
home-services: configuration: Add generic-serialize-alist.
* gnu/home-services/configuration.scm (generic-serialize-alist,
generic-serialize-alist-entry): New functions.

Signed-off-by: Oleg Pykhalov <go.wigust@gmail.com>
-rw-r--r--gnu/home-services/configuration.scm28
1 files changed, 27 insertions, 1 deletions
diff --git a/gnu/home-services/configuration.scm b/gnu/home-services/configuration.scm
index 039877b5c1..3698006c37 100644
--- a/gnu/home-services/configuration.scm
+++ b/gnu/home-services/configuration.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2021 Andrew Tropin <andrew@trop.in>
+;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -20,6 +21,8 @@
   #:use-module (gnu services configuration)
   #:use-module (guix gexp)
   #:use-module (srfi srfi-1)
+  #:use-module (ice-9 curried-definitions)
+  #:use-module (ice-9 match)
 
   #:export (filter-configuration-fields
 
@@ -31,7 +34,9 @@
             string-or-gexp?
 	    serialize-string-or-gexp
 	    text-config?
-            serialize-text-config))
+            serialize-text-config
+            generic-serialize-alist-entry
+            generic-serialize-alist))
 
 (define* (filter-configuration-fields configuration-fields fields
 				      #:optional negate?)
@@ -79,3 +84,24 @@ the list result in @code{#t} when applying PRED? on them."
   (and (list? config) (every string-or-gexp? config)))
 (define (serialize-text-config field-name val)
   #~(string-append #$@(interpose val "\n" 'suffix)))
+
+(define ((generic-serialize-alist-entry serialize-field) entry)
+  "Apply the SERIALIZE-FIELD procedure on the field and value of ENTRY."
+  (match entry
+    ((field . val) (serialize-field field val))))
+
+(define (generic-serialize-alist combine serialize-field fields)
+  "Generate a configuration from an association list FIELDS.
+
+SERIALIZE-FIELD is a procedure that takes two arguments, it will be
+applied on the fields and values of FIELDS using the
+@code{generic-serialize-alist-entry} procedure.
+
+COMBINE is a procedure that takes one or more arguments and combines
+all the alist entries into one value, @code{string-append} or
+@code{append} are usually good candidates for this.
+
+See the @code{serialize-alist} procedure in `@code{(gnu home-services
+version-control}' for an example usage.)}"
+  (apply combine
+         (map (generic-serialize-alist-entry serialize-field) fields)))