NixOS Module System | 150 Members | |
| 29 Servers |
| Sender | Message | Time |
|---|---|---|
| 1 Feb 2024 | ||
apply also generally wouldn't work because this module wouldn't necessarily be at the top level. I mean it could work but would be messy. Also, it breaks out of the module ecosystem and isn't very user friendly. | 20:16:08 | |
| Oh so it doesn't work because to the module system, all definitions have the same priority | 20:16:57 | |
You set them both with out = <attrset>, no mkDefault or so | 20:17:16 | |
But out = mkDefault config.default wouldn't work because then the entire attribute set gets overridden by the users one, therefore not using any defaults | 20:18:00 | |
What you need is out = mapAttrs (name: mkDefault) config.default | 20:18:26 | |
| I'm a little lost. Which line would I inject this:
Also doesn't | 20:21:09 | |
The line out = config.default; | 20:21:48 | |
| * I'm a little lost. Which line would I inject this:
Also isn't | 20:22:09 | |
| Currying function arguments :) | 20:22:12 | |
| that makes sense; set all attrts of default to having order. | 20:23:54 | |
| What is this deep magic!? It works | 20:26:24 | |
Oh did you just apply mkDefault to all the values set in default?? | 20:27:02 | |
| Indeed :) | 20:27:18 | |
| Cool man. Thanks! What is really nice is that I can use So this partially makes sense. But why didn't having a user config with Without your fix, does the config.default have... no priority? What was the failure mechanism before the fix? | 20:31:17 | |
Before, config.user and config.default had the same priority. The conflict happened one level above | 20:32:25 | |
You could've fixed this with { user = lib.mkForce { b = 3; }; } | 20:32:49 | |
So putting the mkForce also on the same level where the conflict happened | 20:33:01 | |
In reply to @infinisil:matrix.orgI tried that! You can see it is the last thing under the # NONE OF THESE WORK; conflicting definitions section. line 56 | 20:34:06 | |
| Oh um.... | 20:34:36 | |
Ahh! The problem is that config.user doesn't contain any mkForce anymore. It's an evaluated option, so all of those modifiers are gone | 20:39:01 | |
So the input to user is lib.mkForce { b = 3; }, but it outputs just { b = 3; }, no conflict there, since there's just one definition | 20:39:48 | |
Similarly the input to defaults is just that one default = { a = 1; b = 2; } (which is actually defaults = lib.mkOptionDefault { ... } but that's not relevant here), it outputs { a = 1; b = 2; } | 20:40:38 | |
| Finally, you have effectively
| 20:41:10 | |
| * Finally, you have effectively
Both of which are without priority, so it recurses into the attrs and conflicts because two | 20:41:59 | |
Instead if you want to actually copy the definitions from one option to another, the mkAlias function suite is what you need: https://github.com/NixOS/nixpkgs/blob/master/lib/modules.nix#L1039-L1073 | 20:43:19 | |
* Instead if you want to actually copy the definitions from one option to another, the mkAlias function suite is what you need: https://github.com/NixOS/nixpkgs/blob/a0d3f10c751b6b2642b44d327470f68ad6bc7952/lib/modules.nix#L1039-L1073 | 20:43:32 | |
| 2 Feb 2024 | ||
| Ah that's a pretty sweet suite. Just so I understanding you completely, you're just mentioning this for other use cases. Not suggesting that it could be used in the example I provided? | 00:45:43 | |
That alias stuff is pretty messy, I wouldn't recommend that myself, but sometimes it is needed. In this case the simpler mapAttrs (name: mkDefault) works though | 02:53:43 | |
| 05:25:20 | ||
| 20:01:14 | ||