[Nix-dev] nixos modules: Setting attrsOf sub-options

Rickard Nilsson rickard.nilsson at telia.com
Wed Jul 1 08:07:25 CEST 2015


I managed to solve this by extending the "top" option definition. So in 
my "plug-in" module I now have:

{
   options.top = mkOption {
     type = with types; attrsOf (submodule ({ name, config, ... }: {
       config.opt2 = f name;
     };
   };
}

   / Rickard

On 07/01/2015 12:31 AM, Rickard Nilsson wrote:
> Hi,
>
> I'm stuck on the following problem with the NixOS module system:
>
> Say I have an option definition like this:
>
>     let
>       subOpts = { ... }: {
>         options = {
>           opt1 = mkOption { ... };
>           opt2 = mkOption { ... };
>         };
>       };
>
>     in {
>       options = {
>         top = mkOption {
>           type = with types; attrsOf (submodule subOpts);
>           default = {};
>         };
>       };
>     }
>
> Then I use it like this:
>
>     top = {
>       one.opt1 = ...;
>       two.opt1 = ...;
>     };
>
> And now I want to set top.*.opt2 in a separate module, based on the
> existing attributes. Essentially something like this:
>
>     top = mkMerge (
>       map (a: { ${a}.opt2 = f a; }) (attrNames config.top)
>     )
>
> But of course, the above results in an infinite recursion since I'm
> using config.top in its own definition.
>
> What I want is simply to be able to plug in a module that defines some
> sub-options without having explicit knowledge about the attribute set.
>
> Does anyone know a way of achieveing this?
>
>
>     / Rickard
> _______________________________________________
> nix-dev mailing list
> nix-dev at lists.science.uu.nl
> http://lists.science.uu.nl/mailman/listinfo/nix-dev
>



More information about the nix-dev mailing list