NixOS Module System | 149 Members | |
| 30 Servers |
| Sender | Message | Time |
|---|---|---|
| 31 Jan 2024 | ||
* Is it possible to override the parameters of an option after creation? If that isn't clear let me explain my situation. I have a module that defines several options that are generic definitions and is imported by several other modules. E.g. I have a format.nix that defines content and order that are both visible to the user. In certain cases where I import format.nix into another module, I want to hide order. So my thought was that I could override the visibility in those modules. But I can't seem to figure out how to do that. Possible? | 05:42:19 | |
djacu: Yeah that's not possible, probably best to have a function with that parameter that returns a new option, like lib.mkPackageOption | 16:03:53 | |
In reply to @infinisil:matrix.orgYeah I figured. Thank infinisil ! | 17:37:10 | |
| 1 Feb 2024 | ||
| Hi all. I have a question about merging user defined options with default options. I am trying to design a module with the following attributes.
I have a working example below. Have I missed something or is this not possible? Thanks
| 19:45:53 | |
| is it possible to solve your problem through the apply option? I mean you can set the defualt to be {}, use
| 20:12:04 | |
| * is it possible to solve your problem through the apply option? I mean you can set the defualt to be {}, use
| 20:12:13 | |
| * is it possible to solve your problem through the apply option? I mean you can set the defualt to be {}, use
| 20:12:42 | |
| Yeah, if I understand your problem correctly. | 20:13:50 | |
Oh don't use apply, that's generally an anti-pattern | 20:14:12 | |
| I'll take a closer look at the code | 20:14:22 | |
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 | |