Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions checkmate/modules/tests/aspect_assignment.nix
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,13 @@
];
};

expr = second.config.x;
# Sort and dedupe for deterministic comparison - merged modules may
# produce duplicates and order is not guaranteed across merges.
expr = lib.sort (a: b: a < b) (lib.unique second.config.x);
expected = [
"foo"
"bar"
"baz"
"foo"
];
in
{
Expand Down
31 changes: 24 additions & 7 deletions nix/types.nix
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ let
aspectSubmodule = lib.types.submodule (
{
name,
aspect,
config,
...
}:
Expand Down Expand Up @@ -94,23 +93,41 @@ let
options.modules = lib.mkOption {
internal = true;
visible = false;
readOnly = true;
description = "resolved modules from this aspect";
type = lib.types.attrsOf lib.types.deferredModule;
default = lib.mapAttrs (class: _: aspect.resolve { inherit class; }) aspect;
# Use a custom type that always takes the last value (no merging)
type = lib.types.mkOptionType {
name = "aspectModules";
description = "resolved modules from aspect";
merge = _loc: _defs: lib.mapAttrs (class: _: config.resolve { inherit class; }) config;
check = _: true;
};
default = lib.mapAttrs (class: _: config.resolve { inherit class; }) config;
};
options.resolve = lib.mkOption {
internal = true;
visible = false;
readOnly = true;
description = "function to resolve a module from this aspect";
type = lib.types.functionTo lib.types.deferredModule;
# Use a custom type that always takes the last value (no merging)
type = lib.types.mkOptionType {
name = "aspectResolve";
description = "resolve function for aspect";
merge =
_loc: _defs:
{
class,
aspect-chain ? [ ],
}:
resolve class aspect-chain (config {
inherit class aspect-chain;
});
check = _: true;
};
default =
{
class,
aspect-chain ? [ ],
}:
resolve class aspect-chain (aspect {
resolve class aspect-chain (config {
inherit class aspect-chain;
});
};
Expand Down