summaryrefslogtreecommitdiff
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)
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)))