[PATCH] services: In MODIFY-SERVICES macro allow specifying a service by its name.

  • Done
  • quality assurance status badge
Details
2 participants
  • Brice Waegeneire
  • Ludovic Courtès
Owner
unassigned
Submitted by
Brice Waegeneire
Severity
normal
B
B
Brice Waegeneire wrote on 1 Aug 2021 23:02
(address . guix-patches@gnu.org)
20210801210254.6119-1-brice@waegenei.re
This is specially useful with any services singleton created with
'simple-service' such as 'set-xorg-configuration'.

* doc/guix.texi (Service Reference)[modify-services]: Document support
for specifying service by its name.
* gnu/services.scm (modify-services): Support specifying a service by
its name in addition to its type.
---
doc/guix.texi | 14 +++++++-------
gnu/services.scm | 5 +++--
2 files changed, 10 insertions(+), 9 deletions(-)

Toggle diff (50 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 2298d512a1..3b50976358 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -34319,20 +34319,20 @@ standard list combinators such as @code{map} and @code{fold} to do that
common pattern.
@deffn {Scheme Syntax} modify-services @var{services} @
- (@var{type} @var{variable} => @var{body}) @dots{}
+ (@var{type-or-name} @var{variable} => @var{body}) @dots{}
Modify the services listed in @var{services} according to the given
clauses. Each clause has the form:
@example
-(@var{type} @var{variable} => @var{body})
+(@var{type-or-name} @var{variable} => @var{body})
@end example
-where @var{type} is a service type---e.g.,
-@code{guix-service-type}---and @var{variable} is an identifier that is
-bound within the @var{body} to the service parameters---e.g., a
-@code{guix-configuration} instance---of the original service of that
-@var{type}.
+where @var{type-or-name} is a service type or name---e.g.,
+@code{guix-service-type} or @code{'guix}---and @var{variable} is an
+identifier that is bound within the @var{body} to the service
+parameters---e.g., a @code{guix-configuration} instance---of the
+original service of that type.
The @var{body} should evaluate to the new service parameters, which will
be used to configure the new service. This new service will replace the
diff --git a/gnu/services.scm b/gnu/services.scm
index 2a8114a219..736ad2e4b9 100644
--- a/gnu/services.scm
+++ b/gnu/services.scm
@@ -303,8 +303,9 @@ singleton service type NAME, of which the returned service is an instance."
(%modify-service svc clauses ...)))
((_ service)
service)
- ((_ svc (kind param => exp ...) clauses ...)
- (if (eq? (service-kind svc) kind)
+ ((_ svc (kind-or-name param => exp ...) clauses ...)
+ (if (or (eq? (service-kind svc) kind-or-name) ;kind
+ (eq? (service-type-name (service-kind svc)) kind-or-name)) ;name
(let ((param (service-value svc)))
(service (service-kind svc)
(begin exp ...)))
--
2.32.0
L
L
Ludovic Courtès wrote on 10 Aug 2021 16:23
(name . Brice Waegeneire)(address . brice@waegenei.re)(address . 49812@debbugs.gnu.org)
87o8a5qsy0.fsf@gnu.org
Hi,

Brice Waegeneire <brice@waegenei.re> skribis:

Toggle quote (3 lines)
> This is specially useful with any services singleton created with
> 'simple-service' such as 'set-xorg-configuration'.

Could you show an example? Services created by ‘simple-service’ &
co. are effectively anonymous; it’s a bit like a lambda.

Toggle quote (5 lines)
> * doc/guix.texi (Service Reference)[modify-services]: Document support
> for specifying service by its name.
> * gnu/services.scm (modify-services): Support specifying a service by
> its name in addition to its type.

[...]

Toggle quote (11 lines)
> +++ b/gnu/services.scm
> @@ -303,8 +303,9 @@ singleton service type NAME, of which the returned service is an instance."
> (%modify-service svc clauses ...)))
> ((_ service)
> service)
> - ((_ svc (kind param => exp ...) clauses ...)
> - (if (eq? (service-kind svc) kind)
> + ((_ svc (kind-or-name param => exp ...) clauses ...)
> + (if (or (eq? (service-kind svc) kind-or-name) ;kind
> + (eq? (service-type-name (service-kind svc)) kind-or-name)) ;name

As a general design pattern in Guix, “names” (symbols) are here for UI
and/or debugging purposes; they should not be used elsewhere because, by
definition, names are ambiguous. Conversely, object references are
unambiguous and non-forgeable, so I prefer interfaces that avoid “names”
entirely.

I hope that makes sense!

Ludo’.
L
L
Ludovic Courtès wrote on 2 Jun 2023 16:20
control message for bug #49812
(address . control@debbugs.gnu.org)
871qiu54jq.fsf@gnu.org
tags 49812 wontfix
close 49812
quit
?
Your comment

This issue is archived.

To comment on this conversation send an email to 49812@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 49812
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch