| 16 May 2025 |
SomeoneSerge (migrating synapse) | H'm, do I get a merged value as an input if I addCheck (submodule ...) (def: def?marker_a)? I just tried adding { foo = { }; } before and after { foo.marker_b = ...; } and it still seems to work | 20:28:37 |
h7x4 | I believe the attrs are merged before being typechecked. I suppose you could try adding a lib.trace inside the typecheck to verify? | 20:32:31 |
SomeoneSerge (migrating synapse) | trace: { below = "_"; }
trace: { marker_b = "bar"; }
trace: { above = "_"; }
trace: { below = "_"; }
{ foo = { above = "_"; below = "_"; marker_b = "bar"; }; }
For modules:
{ foo = { above = "_"; }; }
{
foo.marker_b = "bar";
}
{ foo = { below = "_"; }; }
| 20:37:22 |
SomeoneSerge (migrating synapse) | * trace: { below = "_"; }
trace: { marker_b = "bar"; }
trace: { above = "_"; }
trace: { below = "_"; }
{ foo = { above = "_"; below = "_"; marker_b = "bar"; }; }
For modules:
{ foo = { above = "_"; }; }
{
foo.marker_b = "bar";
}
{ foo = { below = "_"; }; }
| 20:37:32 |
Matt Sturgeon | This won't support foo = { config,...}: { marker_b = "bar"; }.
Type checking is done before merging, but after resolving mkIf (etc) wrappers.
Type checking is used to determine which type to use for merging. | 20:39:18 |
h7x4 | Aha, that makes sense 👍️ | 20:41:25 |
SomeoneSerge (migrating synapse) | Sounds like __result is least wrong? | 20:50:51 |
SomeoneSerge (migrating synapse) | * Sounds like __result is the least wrong? | 20:50:55 |
SomeoneSerge (migrating synapse) | H'm what if freeformTypes are different? attrsOf a and attrsOf b | 20:53:42 |
Matt Sturgeon | I believe the freeform type can be conditional on a marker option being defined without infinite recursion. | 20:58:27 |
Matt Sturgeon | So long as the marker options are explicitly defined, they are resolved before freeform definitions | 20:59:14 |
SomeoneSerge (migrating synapse) | Not sure I should depend on this detail 😅 | 20:59:19 |
Matt Sturgeon | * So long as the marker options are explicitly declared, they are resolved before freeform definitions | 20:59:26 |
Matt Sturgeon | freeformType is itself an option (config._module.freeformType), so it's not really an implementation detail | 21:00:17 |
Matt Sturgeon | (
{ options, ... }:
{
freeformType = attrsOf (
if options.marker_a.isDefined && options.marker_b.isDefined then
throw "both `${options.marker_a}' and `${options.marker_b}' are defined"
else if options.marker_a.isDefined then
a
else if options.marker_b.isDefined then
b
else
throw "neither `${options.marker_a}' or `${options.marker_b}' are defined"
);
}
)
| 21:06:01 |
Matt Sturgeon | _Note: stringifying an option will use it's showOption opt.loc location, so you'll automatically get the full option prefix, e.g. "foo.marker_b" | 21:07:27 |
Matt Sturgeon | * Note: stringifying an option will use it's showOption opt.loc location, so you'll automatically get the full option prefix, e.g. "foo.marker_b" | 21:07:39 |
SomeoneSerge (migrating synapse) | Awe and horror | 21:41:09 |
SomeoneSerge (migrating synapse) | I suspect this works and then gets rejected by some kind of a final type check: error: The option marker_a' was accessed but has no value defined. Try setting the option` | 22:04:36 |
SomeoneSerge (migrating synapse) | * I suspect this works and then gets rejected by some kind of a final type check: error: The option `marker_a' was accessed but has no value defined. Try setting the option | 22:04:51 |
SomeoneSerge (migrating synapse) | * I suspect this works and then gets rejected by some kind of a final type check: error: The option `marker_a' was accessed but has no value defined. Try setting the option
(my attempt: https://gist.github.com/SomeoneSerge/29a9e6e10cdcd3596f865c41c7042610)
| 22:05:59 |