NixOS Module System | 209 Members | |
| 50 Servers |
| Sender | Message | Time |
|---|---|---|
| 29 May 2026 | ||
the final merged configuration isn't visible to the functor. Because it only exists after merging option definitions. Option definitions can only exist once a type is used with an option. | 12:43:46 | |
*
the final merged configuration isn't visible to the functor. Because it only exists after merging option definitions. Option definitions can only exist once a type is used with an option. | 12:44:14 | |
| I'm starting from (nixos {}).options.services.<module>, IIUC those are merged option definitions, just may not be complete yet, missing some required definitions? | 12:46:26 | |
| The functor you referred to is The option itself has access to it's final merged value ( Once you return | 12:50:48 | |
| Except for the `loc` no? | 12:52:22 | |
| Sure, but that's just a list of strings, not an option. | 12:52:41 | |
| I don't think I have a need for that information once I recurse, since what I return will be under the <module> or whatever nested option. | 12:53:17 | |
* Sure, but that's just a list of strings, not an option. It's useful only for properly prefixing the sub-options' own locs, for user-facing clarity. | 12:53:20 | |
| getSubOptions doesn't return a flat structure of all nested options, right? So I don't need to sort them by loc to regain the structure? | 12:55:03 | |
| I always recommend trying to keep the prefix accurate, so that once you have your final list of options you can do In my interpretation of I'm not aware of any types that do that currently, but it's something to be aware of. | 12:59:57 | |
| * I always recommend trying to keep the prefix accurate, so that once you have your final list of options you can do This may be controversial, but in my interpretation of I'm not aware of any types that do that currently, but it's something to be aware of. | 13:00:23 | |
| You mean something like attrsOf (either submodule submodule)? | 13:24:25 | |
| Yeah. Although currently that's not very common because it's not easy to discriminate between submodule-specific module definitions. A more practical example may be
| 13:34:48 | |
| is it an axiom that merging a single definition just results in the first definition's value? | 18:35:04 | |
| merge functions can also transform definitions, but I'd say the value should always be derived from that definition's value. Unless the merge function throws or something. | 18:36:24 | |
| * merge functions can also transform definitions,* but I'd say the value should always be derived from that definition's value. Unless the merge function throws or something. * e.g. types.coercedTo | 18:36:49 | |
| gotcha, i was foolishly hoping for a
| 18:42:10 | |
| we could do this with a special type attribute (unchangedOnSingleton) but it's certainly hacky | 18:43:13 | |
| * merge functions can also transform definitions,* but I'd say the value should always be derived from that definition's value. Unless the merge function throws or something. * e.g. types.coercedTo, types.submodule, etc | 18:43:49 | |
like a lot of the basic types are defined with mergeEqualOption, which could employ this kind of short circuiting | 18:45:44 | |
| but i'm really just trying to win back performance on a PR that can't | 18:46:14 | |
| it does that anyways, just after another function call | 18:46:30 | |
| I was gonna say something similar:
| 18:47:51 | |
| IIRC, there were already some performance vs convenience conversations in the original v2 check & merge PRs. With more types implementing v2, we need to call actual merge functions in order to check for errors anyway; so it's going to be hard to have zero performance hit. | 18:49:50 | |
yeah there's lots of small things - every merge seems to cost another function call with v2, because from my testing, functors always get called with self, not just once, and isV2MergeCoherent = true; gets set for v2 merges | 18:51:47 | |
| anyways, PR going up to your branch for nullOr | 18:51:52 | |
| https://github.com/MattSturgeon/nixpkgs/pull/1 up! | 19:04:49 | |
I'm also not 100% on that. IIUC, it's supposed to work even if there are (unrelated) errors. Originally, If that has a large performance cost, it may not be worth it; so you're optimisation may be acceptable. Ideally we'd get @hsjobeki or @roberth's input on idiomatic Looking at how it simplifies the overall diff, I personally think it's fine. | 19:19:36 | |
I'd prefer we didn't increase the scope of my PR to include this. Do you mind moving that to a dedicated PR against nixpkgs? | 19:19:38 | |
| Are you happy for me to squash your changes into a "co-authored-by" commit, or would you prefer I merge your actual commits as-is? Typically we avoid having commits in a PR that fix earlier commits in the same PR, unless there's a specific story we want to tell in the git history. | 19:21:47 | |