unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
From: Andrew Tropin <andrew@trop.in>
To: "Ludovic Courtès" <ludo@gnu.org>, "Xinglu Chen" <public@yoctocell.xyz>
Cc: Oleg Pykhalov <go.wigust@gmail.com>, 50967@debbugs.gnu.org
Subject: [bug#50967] file-like objects instead of gexps
Date: Wed, 06 Oct 2021 11:15:31 +0300	[thread overview]
Message-ID: <87czoilgbg.fsf@trop.in> (raw)
In-Reply-To: <878rz8q42z.fsf_-_@gnu.org>

[-- Attachment #1: Type: text/plain, Size: 6586 bytes --]

On 2021-10-04 16:04, Ludovic Courtès wrote:

> Xinglu Chen <public@yoctocell.xyz> skribis:
>
>> On Sat, Oct 02 2021, Oleg Pykhalov wrote:
>>
>>> * gnu/home/services/configuration.scm (interpose): Include content of files.
>>> (string-or-gexp?): Rename to 'file-or-string-or-gexp?' and check for file-like
>>> object.
>>
>> I would call it ‘file-like-or-string-or-gexp?’, just ‘files’ doesn’t
>> really make it clear that it should be a “file-like object”.
>
> As a matter of API, I would make it monomorphic: accept a file-like
> object, period.  This is what’s done for System services (and
> polymorphic APIs are rare in general in Guix).

At least some of system services are far from ideal, recently I tried to
add rtmp section to nginx configuration using nginx system service.  I
had two options and both does look hacky, I could use extra-content
starting with closing curly bracket:

--8<---------------cut here---------------start------------->8---
(service nginx-service-type
         (nginx-configuration
          (modules
           (list
            (file-append nginx-rtmp-module "\
/etc/nginx/modules/ngx_rtmp_module.so")))
          (extra-content
           (format #f "\
}
rtmp {
        server {
                listen 1935;
                chunk_size 4096;

                application live {
                        live on;
                        record off;
                        push rtmp://a.rtmp.youtube.com/live2/~a;
                        push rtmp://diode.zone:1935/live/~a;
                }
        }
" youtube-key peertube-key))

          (server-blocks
           (list (nginx-server-configuration
                  ;; (locations
                  ;;  (list
                  ;;   (nginx-location-configuration
                  ;;    (uri "/stat")
                  ;;    (body '("rtmp_stat all;"
                  ;;            "rtmp_stat_stylesheet stat.xsl;")))))
                  (server-name `(,ip))
                  (listen '("8088"))
                  (root "/var/www/"))))))
--8<---------------cut here---------------end--------------->8---

or use file field of nginx-configuration record and generate the whole
configuration myself inside computed-file, loosing all the benifits of
other nginx-configuration fields.

Personally, I don't find both of these approaches appealing and
convenient.  Maybe it's an issue of exact system service, but the way
the configuration for this service is implemented is getting in the way
of the user.

>
> ‘plain-file’ and ‘scheme-file’ allow users to “convert” a string or a
> gexp into a file-like object.
>
> WDYT?
>
> Ludo’.
>
>
>

Imagine the following use case: I want to create a home service, which
accepts a package (zsh plugin) and adds a code for loading this package
to zshrc, currently it's implemented like that:

https://git.sr.ht/~abcdw/rde/tree/69dd2baf0384c899a4a4f97bdac8bf0b6e499b82/item/gnu/home-services/shellutils.scm#L18

Exteding the service above with `(list zsh-autosuggestions)` will add
the following line to zshrc:

source /gnu/store/w7d43gk1qszplj9i0rkzqvzz6kp88qfm-zsh-autosuggestions-0.7.0/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh

Or the same thing can be done manually by user:

--8<---------------cut here---------------start------------->8---
(service
 home-zsh-service-type
 (home-zsh-configuration
  (zshrc
   (list
    #~(string-append "source " #$zsh-autosuggestions "/share/zs../..ions.zsh")
    ;; or
    "source \\"
    (file-append zsh-autosuggestions "/share/zs../..ions.zsh")))))
--8<---------------cut here---------------end--------------->8---

gexps returns a string, file-like object returns a path to the file in
the store, kinda expected behavior.  Both implementations looks quite
simple.


Now I'll try to reimplement it with file-like objects.  The code below
is a pseudo code, but should demonstrate the overall concerns I have:

--8<---------------cut here---------------start------------->8---
;; Some generic functions
(define get-file-like-object-path (file-like)
  "Because all file-like object get inserted literally by home services,
we need a function, which returns a file, which contains a path to the
file."
  (computed-file
   "tmp-file"
   #~#$file-like))

(define fl-append-strings (lst)
  "Accepts a list of strings and file-like object, reads the content of
the file-like objects (to be consistent with behavior of home services
configuration)."
  (define file-like->str (mb-file-like)
    (if (string? mb-file-like)
        mb-file-like
        #~(begin
            (use-modules (ice-9 rdelim))
            (with-fluids ((%default-port-encoding "UTF-8"))
              (with-input-from-file #$mb-file-like read-string)))))
  (computed-file
   "tmp-file"
   #~(apply string-append '#$(map file-like->str lst))))


;; A home service, declared in home-environment.
(service
 home-zsh-service-type
 (home-zsh-configuration
  (zshrc
   (list
    (fl-append-strings
     (list
      "source "
      (get-file-like-object-path zsh-autosuggestions)
      "/share/zs../..ions.zsh"))
    ;; or
    "source \\"
    (get-file-like-object-path
     (file-append zsh-autosuggestions "/share/zs../..ions.zsh"))))))
--8<---------------cut here---------------end--------------->8---

Here we don't use gexps inside configuration and all file-like objects
are "expanded" as their content instead of path in the store.

It can work, but looks a little strange and hard to copmose.  Perhaps, I
miss something and doesn't see the whole picture, but for now expanding
file-like objects to their content and throwing out gexps doesn't look
appealing to me.

BTW, I've skimmed through the paper "Code Staging in GNU Guix" and
limitations section, still not sure what your concerns are, I'll try to
re-read the paper and your message <87pmvqckws.fsf@gnu.org> one more
time a few days later to better understand it.  If you have a spare
time, please make a simple code snippet, which demonstrates the problem
you've mentioned in the message, which will hit the users of home
services.  It will help me to figure out possible shortcommings and
better understand the problem.

Ludovic, sorry for spending your time on that, but I really need to
understand this thing better.  Thank you in advance for hepling on that.

Oleg, thank you for working on this patch series, much appreciate)


-- 
Best regards,
Andrew Tropin

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

  reply	other threads:[~2021-10-06  8:22 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-02 13:43 [bug#50967] [PATCH 00/12] Move (gnu home-services XYZ) to (gnu services XYZ) Oleg Pykhalov
2021-10-02 13:45 ` [bug#50967] [PATCH 01/12] tests: Add tests for guix home cli Oleg Pykhalov
2021-10-02 13:45   ` [bug#50967] [PATCH 02/12] gnu: home-services: Move configuration to (gnu services) Oleg Pykhalov
2021-10-02 13:45   ` [bug#50967] [PATCH 03/12] gnu: home-services: Move symlink-manager " Oleg Pykhalov
2021-10-02 13:45   ` [bug#50967] [PATCH 04/12] gnu: home-services: Move utils " Oleg Pykhalov
2021-10-02 13:45   ` [bug#50967] [PATCH 05/12] gnu: home-services: Move fontutils " Oleg Pykhalov
2021-10-02 13:45   ` [bug#50967] [PATCH 06/12] gnu: home-services: Move shells " Oleg Pykhalov
2021-10-02 13:45   ` [bug#50967] [PATCH 07/12] gnu: home-services: Move xdg " Oleg Pykhalov
2021-10-02 13:45   ` [bug#50967] [PATCH 08/12] gnu: home-services: Move shepherd " Oleg Pykhalov
2021-10-02 13:46   ` [bug#50967] [PATCH 09/12] gnu: home-services: Move mcron " Oleg Pykhalov
2021-10-02 13:46   ` [bug#50967] [PATCH 10/12] gnu: home-services: Change %service-type-path and filter services Oleg Pykhalov
2021-10-02 13:46   ` [bug#50967] [PATCH 11/12] scripts: home: (gnu home-services bash) -> (gnu services bash) Oleg Pykhalov
2021-10-02 13:46   ` [bug#50967] [PATCH 12/12] doc: (gnu home-services) -> (gnu services) Oleg Pykhalov
2021-10-02 16:38 ` [bug#50967] [PATCH 01/14] tests: Add tests for guix home cli Oleg Pykhalov
2021-10-02 16:38   ` [bug#50967] [PATCH 02/14] gnu: home-services: Move configuration to (gnu home services) Oleg Pykhalov
2021-10-02 18:37     ` Xinglu Chen
2021-10-02 16:38   ` [bug#50967] [PATCH 03/14] gnu: home-services: Move symlink-manager " Oleg Pykhalov
2021-10-02 16:38   ` [bug#50967] [PATCH 04/14] gnu: home-services: Move utils " Oleg Pykhalov
2021-10-02 16:38   ` [bug#50967] [PATCH 05/14] gnu: home-services: Move fontutils to (gnu services) Oleg Pykhalov
2021-10-02 16:38   ` [bug#50967] [PATCH 06/14] gnu: home-services: Move shells to (gnu home services) Oleg Pykhalov
2021-10-02 16:38   ` [bug#50967] [PATCH 07/14] gnu: home-services: Move xdg " Oleg Pykhalov
2021-10-02 16:38   ` [bug#50967] [PATCH 08/14] gnu: home-services: Move shepherd " Oleg Pykhalov
2021-10-02 16:38   ` [bug#50967] [PATCH 09/14] gnu: home-services: Move mcron " Oleg Pykhalov
2021-10-02 16:38   ` [bug#50967] [PATCH 10/14] scripts: home: (gnu home-services bash) -> (gnu home services bash) Oleg Pykhalov
2021-10-02 16:38   ` [bug#50967] [PATCH 11/14] doc: (gnu home-services) -> (gnu home services) Oleg Pykhalov
2021-10-02 16:38   ` [bug#50967] [PATCH 12/14] gnu: home-services: Update %service-type-path Oleg Pykhalov
2021-10-04 14:01     ` [bug#50967] [PATCH 00/12] Move (gnu home-services XYZ) to (gnu services XYZ) Ludovic Courtès
2021-10-02 16:38   ` [bug#50967] [PATCH 13/14] home: services: configuration: Support file-like objects Oleg Pykhalov
2021-10-02 18:35     ` Xinglu Chen
2021-10-04 14:04       ` [bug#50967] [PATCH 00/12] Move (gnu home-services XYZ) to (gnu services XYZ) Ludovic Courtès
2021-10-06  8:15         ` Andrew Tropin [this message]
2021-10-08  7:56           ` [bug#50967] file-like objects instead of gexps Ludovic Courtès
2021-10-08 10:00             ` Andrew Tropin
2021-10-09 13:34               ` Ludovic Courtès
2021-10-14  8:32                 ` Andrew Tropin
2021-10-08 13:45           ` Xinglu Chen
2021-10-08 14:34             ` Andrew Tropin
2021-10-08 10:06     ` [bug#50967] [PATCH 13/14] home: services: configuration: Support file-like objects Andrew Tropin
2021-10-14  7:08     ` Andrew Tropin
2021-10-02 16:38   ` [bug#50967] [PATCH 14/14] doc: Document guix home import Oleg Pykhalov
2021-10-02 18:42     ` Xinglu Chen
2021-10-02 19:45       ` Oleg Pykhalov
2021-10-04 13:58   ` [bug#50967] [PATCH 00/12] Move (gnu home-services XYZ) to (gnu services XYZ) Ludovic Courtès
2021-10-04 23:13     ` [bug#50967] [PATCH 1/3] gnu: Move (gnu home-services) to (gnu home services) Oleg Pykhalov
2021-10-04 23:13       ` [bug#50967] [PATCH 2/3] home: services: configuration: Support file-like objects Oleg Pykhalov
2021-10-04 23:13       ` [bug#50967] [PATCH 3/3] guix: scripts: Make sure profile directory exists Oleg Pykhalov
2021-10-05 10:20         ` Oleg Pykhalov
2021-10-06 21:22           ` [bug#50967] [PATCH 00/12] Move (gnu home-services XYZ) to (gnu services XYZ) Ludovic Courtès
2021-10-06 22:05         ` [bug#50967] [PATCH 3/3] guix: scripts: Make sure profile directory exists Oleg Pykhalov
2021-10-06 22:15           ` [bug#50967] [PATCH 00/12] Move (gnu home-services XYZ) to (gnu services XYZ) Oleg Pykhalov
2021-10-07  6:37             ` Maxime Devos
2021-10-07  9:56               ` Oleg Pykhalov
2021-10-07 16:43                 ` Maxime Devos
2021-10-08 22:44               ` Ludovic Courtès
2021-10-08 22:57           ` Ludovic Courtès
2021-10-09 12:34             ` Oleg Pykhalov
2021-10-09 12:45               ` Oleg Pykhalov
2021-10-09 14:34               ` Ludovic Courtès
2021-10-09 19:39                 ` bug#50967: " Oleg Pykhalov
2021-10-08 12:44       ` [bug#50967] " Oleg Pykhalov
2021-10-08 14:27         ` Andrew Tropin
2021-10-08 22:46           ` Ludovic Courtès
2021-10-08 22:49       ` Ludovic Courtès
2021-10-02 20:13 ` [bug#50967] [PATCH] home: services: configuration: Move and refactor content Oleg Pykhalov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87czoilgbg.fsf@trop.in \
    --to=andrew@trop.in \
    --cc=50967@debbugs.gnu.org \
    --cc=go.wigust@gmail.com \
    --cc=ludo@gnu.org \
    --cc=public@yoctocell.xyz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).