From 0c0c1b21d959a9761a247309428c64a92c599fb3 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Wed, 13 Sep 2017 16:02:22 +0200 Subject: services: Add 'fold-service-types'. * gnu/services.scm (%distro-root-directory, %service-type-path): New variables. (fold-service-types): New procedure. --- gnu/services.scm | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'gnu') 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 @@ (define-module (gnu services) #: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 @@ (define-module (gnu services) service-type-description service-type-location + %service-type-path + fold-service-types service service? @@ -165,6 +168,27 @@ (define (write-service-type type port) (set-record-type-printer! 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 (make-service type value) -- cgit v1.2.3