On 2022-02-07 00:13, Ludovic Courtès wrote: > Hi Andrew, > > Andrew Tropin skribis: > >> The current implementation of escape hatch doesn't work (I can't set >> missing options in redshift section, because extra-content added after >> manual section begins, and I'm not sure if redshift's ini parser allows >> to define a section with the same name a few times, Git for example >> allows to do so, but it's more an exception). There are a few ways to fix it: >> >> 1. Move manual section on top of redshift section, so the extra-content >> will be added just after redshift section >> 2. Move extra-content before manual section to accoplish the same. >> 3. Use file escape hatch (as it done in some system services), which >> will invalidate all the options set before and just place the content of >> file field as a value of configuration. >> 4. Provide the bindings for other options (probably what you were asking). > > Ah got it. I went for #2 and #4 (there are still missing options, but > we can add them when people actually need them.) > > Pushed as 39e8025d3b40a0079f75e0ce9a91b6dad6766773. > Good, thank you for working on this!) >>> How does NixOS handle escape hatches today? Back when I was using it is >>> that it wasn’t any more consistent than what we have today, which is at >>> least a consolation. >> >> I don't remember, how it's done for nixos "system modules", but in >> home-manager it's relatively consistent, in most cases it just a nested >> maps (attrsets, a little more high-level analogue of alists): >> https://rycee.gitlab.io/home-manager/options.html#opt-programs.git.extraConfig >> https://rycee.gitlab.io/home-manager/options.html#opt-accounts.email.accounts._name_.msmtp.extraConfig >> https://rycee.gitlab.io/home-manager/options.html#opt-gtk.gtk3.extraConfig >> >> Sometimes, it allows to add a multi-line string to the end of the file: >> https://rycee.gitlab.io/home-manager/options.html#opt-programs.abook.extraConfig >> >> but it's getting deprecated, when proper serializer for target config >> format is implemented: >> https://github.com/nix-community/home-manager/blob/master/modules/programs/git.nix#L342 >> >> As you can see, they provide a list of frequently used options as >> top-level "fields", but all of them, including extraConfig just extends >> (get merged) to primary "config" (iniContent for git for example) and >> after that, this primary "config" attributeset get serialized to the >> target config file. While they have this "escape hatch", it works the >> same way as all other fields with the only difference: it doesn't have >> schema (just untyped attributeset). This is quite close to what we do >> in rde. > > OK, I see. Nix is all about attribute sets, which are dictionaries, > like alists, and just as sloppy: you can add attributes but they may or > may not be ignored, you never know. Here they “take advantage” of that, > IIUC, by serializing attributes that happen to be here. > > Nix (the language) doesn’t have the ability to define disjoint types > like what we’re doing with configuration record types, and to me that’s > a weakness that directly affects usability. > > Thanks, > Ludo’. -- Best regards, Andrew Tropin