summary refs log tree commit diff
path: root/gnu/services.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2024-02-23 21:22:55 +0100
committerLudovic Courtès <ludo@gnu.org>2024-03-22 11:40:33 +0100
commit29de2edfbbed21ac016f73a45d399795fc2e4dfb (patch)
tree54db192b7526446c974cdb317d753694e32cd19b /gnu/services.scm
parentb5018807ee4b09962507b67f7506cbdc70d6c810 (diff)
downloadguix-29de2edfbbed21ac016f73a45d399795fc2e4dfb.tar.gz
system, home: Validate ‘services’ field value.
This guides newcomers who might stick a single (service …) form
in this field.

* gnu/services.scm (validate-service-list): New macro.
(%validate-service-list): New procedure.
* gnu/system.scm (<operating-system>)[services]: Add ‘sanitize’.
* gnu/home.scm (<home-environment>)[services]: Add ‘sanitize’.

Change-Id: I9e29bd9a078e87b627ab766fd669ba9de79f8473
Diffstat (limited to 'gnu/services.scm')
-rw-r--r--gnu/services.scm19
1 files changed, 18 insertions, 1 deletions
diff --git a/gnu/services.scm b/gnu/services.scm
index 59481af10f..88593e8091 100644
--- a/gnu/services.scm
+++ b/gnu/services.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2015-2023 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2015-2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2020, 2021 Ricardo Wurmus <rekado@elephly.net>
@@ -91,6 +91,8 @@
             for-home
             for-home?
 
+            validate-service-list
+
             service-error?
             missing-value-service-error?
             missing-value-service-error-type
@@ -1271,4 +1273,19 @@ Home service rather than a System service."
   (syntax-parameterize ((for-home? (identifier-syntax #t)))
     exp ...))
 
+(define-with-syntax-properties (validate-service-list (value properties))
+  (%validate-service-list value properties))
+
+(define (%validate-service-list value properties)
+  (match value
+    (((? service?) ...) value)
+    (_
+     (raise
+      (make-compound-condition
+       (condition
+        (&error-location
+         (location (source-properties->location properties))))
+       (formatted-message
+        (G_ "'services' field must contain a list of services")))))))
+
 ;;; services.scm ends here.