diff options
author | Ludovic Courtès <ludo@gnu.org> | 2017-09-13 16:02:22 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2017-09-16 17:47:46 +0200 |
commit | 0c0c1b21d959a9761a247309428c64a92c599fb3 (patch) | |
tree | 22b0c8b2d377a4efd2056bafb683e847ba781128 | |
parent | b714395a39fffc60f75408504a23dfe27ad13fc2 (diff) | |
download | guix-0c0c1b21d959a9761a247309428c64a92c599fb3.tar guix-0c0c1b21d959a9761a247309428c64a92c599fb3.tar.gz |
services: Add 'fold-service-types'.
* gnu/services.scm (%distro-root-directory, %service-type-path): New
variables.
(fold-service-types): New procedure.
-rw-r--r-- | gnu/services.scm | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/gnu/services.scm b/gnu/services.scm index 83a163b766..2ebd701a59 100644 --- a/gnu/services.scm +++ b/gnu/services.scm @@ -23,6 +23,7 @@ #:use-module (guix store) #:use-module (guix records) #:use-module (guix profiles) + #:use-module (guix discovery) #:use-module (guix sets) #:use-module (guix ui) #:use-module ((guix utils) #:select (source-properties->location)) @@ -52,6 +53,8 @@ service-type-description service-type-location + %service-type-path + fold-service-types service service? @@ -165,6 +168,27 @@ (set-record-type-printer! <service-type> write-service-type) +(define %distro-root-directory + ;; Absolute file name of the module hierarchy. + (dirname (search-path %load-path "guix.scm"))) + +(define %service-type-path + ;; Search path for service types. + (make-parameter `((,%distro-root-directory . "gnu/services") + (,%distro-root-directory . "gnu/system")))) + +(define* (fold-service-types proc seed + #:optional + (modules (all-modules (%service-type-path)))) + "For each service type exported by one of MODULES, call (PROC RESULT). SEED +is used as the initial value of RESULT." + (fold-module-public-variables (lambda (object result) + (if (service-type? object) + (proc object result) + result)) + '() + modules)) + ;; Services of a given type. (define-record-type <service> (make-service type value) |