mirror of
https://codeberg.org/hako/Rosenthal.git
synced 2026-02-20 11:04:32 +00:00
utils: Add modify-services/by-name.
* modules/rosenthal/utils/services.scm (modify-services/by-name): New macro. * .dir-locals.el (scheme-mode): Add it.
This commit is contained in:
parent
f536df13ce
commit
eab1e4b7b9
@ -42,6 +42,7 @@
|
||||
.
|
||||
((eval . (put 'computed-substitution-with-inputs 'scheme-indent-function 1))
|
||||
(eval . (put 'hidden-desktop-entry 'scheme-indent-function 1))
|
||||
(eval . (put 'modify-services/by-name 'scheme-indent-function 1))
|
||||
|
||||
(eval . (put 'btrbk-configuration 'scheme-indent-function 0))
|
||||
(eval . (put 'caddy-configuration 'scheme-indent-function 0))
|
||||
|
||||
113
modules/rosenthal/utils/services.scm
Normal file
113
modules/rosenthal/utils/services.scm
Normal file
@ -0,0 +1,113 @@
|
||||
;;; SPDX-License-Identifier: GPL-3.0-or-later
|
||||
;;; Copyright © 2026 Hilton Chain <hako@ultrarare.space>
|
||||
|
||||
(define-module (rosenthal utils services)
|
||||
;; Guile builtins
|
||||
#:use-module (ice-9 match)
|
||||
#:use-module (srfi srfi-1)
|
||||
#:use-module (srfi srfi-35)
|
||||
;; Utilities
|
||||
#:use-module (guix diagnostics)
|
||||
#:use-module (guix i18n)
|
||||
;; Guix System - services
|
||||
#:use-module (gnu services)
|
||||
#:export (modify-services/by-name))
|
||||
|
||||
|
||||
;;;
|
||||
;;; modify-services/by-name
|
||||
;;;
|
||||
|
||||
;; Adapted from (gnu services).
|
||||
|
||||
(define-syntax clause-alist
|
||||
(syntax-rules (=> delete)
|
||||
((_ (delete name) rest ...)
|
||||
(cons (list name
|
||||
(lambda (service)
|
||||
#f)
|
||||
(current-source-location))
|
||||
(clause-alist rest ...)))
|
||||
((_ (name param => exp ...) rest ...)
|
||||
(cons (list name
|
||||
(lambda (svc)
|
||||
(let ((param (service-value svc)))
|
||||
(service (service-kind svc)
|
||||
(begin exp ...))))
|
||||
(current-source-location))
|
||||
(clause-alist rest ...)))
|
||||
((_)
|
||||
'())))
|
||||
|
||||
(define (apply-clauses clauses service deleted-services)
|
||||
(define (raise-if-deleted name properties)
|
||||
(match (find (match-lambda
|
||||
((deleted-name _)
|
||||
(eq? name deleted-name)))
|
||||
deleted-services)
|
||||
((_ deleted-properties)
|
||||
(raise (make-compound-condition
|
||||
(condition
|
||||
(&error-location
|
||||
(location (source-properties->location properties))))
|
||||
(formatted-message
|
||||
(G_ "modify-services: service '~a' was deleted here: ~a")
|
||||
name
|
||||
(source-properties->location deleted-properties)))))
|
||||
(_ #t)))
|
||||
|
||||
(match clauses
|
||||
(((name proc properties) . rest)
|
||||
(raise-if-deleted name properties)
|
||||
(if (eq? (and service (service-type-name (service-kind service))) name)
|
||||
(let ((new-service (proc service)))
|
||||
(apply-clauses rest new-service
|
||||
(if new-service
|
||||
deleted-services
|
||||
(cons (list name properties)
|
||||
deleted-services))))
|
||||
(apply-clauses rest service deleted-services)))
|
||||
(()
|
||||
service)))
|
||||
|
||||
(define (%modify-services services clauses)
|
||||
(define (raise-if-not-found clause)
|
||||
(match clause
|
||||
((name _ properties)
|
||||
(unless (find (lambda (service)
|
||||
(eq? name (service-type-name (service-kind service))))
|
||||
services)
|
||||
(raise (make-compound-condition
|
||||
(condition
|
||||
(&error-location
|
||||
(location (source-properties->location properties))))
|
||||
(formatted-message
|
||||
(G_ "modify-services/by-name: service '~a' not found in service list")
|
||||
name)))))))
|
||||
|
||||
(for-each raise-if-not-found clauses)
|
||||
(reverse (filter-map identity
|
||||
(fold (lambda (service services)
|
||||
(cons (apply-clauses clauses service '())
|
||||
services))
|
||||
'()
|
||||
services))))
|
||||
|
||||
(define-syntax modify-services/by-name
|
||||
(syntax-rules ()
|
||||
"Similiar to modify-services but uses the name of the service type instead.
|
||||
For example:
|
||||
|
||||
(modify-services %base-services
|
||||
('guix
|
||||
config => (guix-configuration
|
||||
(inherit config)
|
||||
(use-substitutes? #f)
|
||||
(extra-options '(\"--gc-keep-derivations\"))))
|
||||
('mingetty
|
||||
config => (mingetty-configuration
|
||||
(inherit config)
|
||||
(motd (plain-file \"motd\" \"Hi there!\"))))
|
||||
(delete 'udev))"
|
||||
((_ services clauses ...)
|
||||
(%modify-services services (clause-alist clauses ...)))))
|
||||
Loading…
Reference in New Issue
Block a user