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
67 changes: 49 additions & 18 deletions modules/aspects/provides/forward.nix
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,12 @@ let
intoClass = fwd.intoClass item;
intoPath = fwd.intoPath item;

sourceModule = den.lib.aspects.resolve fromClass [ ] (fwd.fromAspect item);
asp = fwd.fromAspect item;

sourceModule = den.lib.aspects.resolve fromClass [ asp ] asp;

freeformMod = {
config._module.freeformType = lib.types.lazyAttrsOf lib.types.unspecified;
config._module.freeformType = lib.types.lazyAttrsOf lib.types.anything;
};

adapterKey = lib.concatStringsSep "/" (
Expand Down Expand Up @@ -106,28 +108,57 @@ let
};
};

extraArgsFor =
args:
if adaptArgs == null then { } else builtins.removeAttrs (adaptArgs args) (builtins.attrNames args);

wrapTree =
gApply: outerArgs: node:
if builtins.isAttrs node && node ? imports then
{ imports = map (wrapTree gApply outerArgs) node.imports; }
else
_modArgs:
let
result = if lib.isFunction node then node outerArgs else node;
in
{
config = gApply result;
};

evalImport =
args:
let
extraArgs = extraArgsFor args;
specialArgs =
builtins.removeAttrs args [
"config"
"options"
"lib"
]
// extraArgs;
evaluated = lib.evalModules {
inherit specialArgs;
modules = (if adapterModule == null then [ freeformMod ] else [ adapterModule ]) ++ [
sourceModule
];
};
in
guardFn args evaluated.config;

canDirectImport = adapterModule == null;

topLevelAdapter.${intoClass} = {
__functionArgs = guardArgs;
__functor =
_: args:
let
extraArgs =
if adaptArgs == null then { } else builtins.removeAttrs (adaptArgs args) (builtins.attrNames args);
specialArgs =
builtins.removeAttrs args [
"config"
"options"
"lib"
]
// extraArgs;
evaluated = lib.evalModules {
inherit specialArgs;
modules = (if adapterModule == null then [ freeformMod ] else [ adapterModule ]) ++ [
sourceModule
];
};
gApply = if guard == null then lib.id else guardFn args;
fullArgs = args // extraArgsFor args;
in
guardFn args evaluated.config;
if canDirectImport then
{ imports = [ (wrapTree gApply fullArgs sourceModule) ]; }
else
evalImport args;
};

needsAdapter = guard != null || adaptArgs != null || adapterModule != null;
Expand Down
2 changes: 1 addition & 1 deletion nix/lib/types.nix
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ let
let
asp = intent { ${name} = from; };
in
den.lib.aspects.resolve (from.class) [ ] asp;
den.lib.aspects.resolve (from.class) [ asp ] asp;
in
{
inherit hostsOption homesOption;
Expand Down
62 changes: 52 additions & 10 deletions templates/ci/modules/features/forward-alias-class.nix
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
den,
lib,
igloo,
tuxHm,
...
}:
let
Expand All @@ -18,6 +19,7 @@
intoClass = _: "homeManager";
intoPath = _: [ ];
fromAspect = _: lib.head aspect-chain;
guard = { pkgs, ... }: true;
adaptArgs =
{ config, ... }:
{
Expand All @@ -31,22 +33,41 @@
den.aspects.igloo.nixos.networking.hostName = "storm";

den.aspects.tux = {
includes = [ forwarded ];
home =
{ osConfig, ... }:
{
programs.fish.enable = true;
home.keyboard.model = osConfig.networking.hostName;
};
includes = [
forwarded
den.aspects.foo
];
};

den.aspects.foo.includes = [
den.aspects.bar
den.aspects.baz
];
den.aspects.bar.home =
{ osConfig, pkgs, ... }:
{
programs.fish.enable = true;
home.keyboard.model = osConfig.networking.hostName;
home.packages = [ pkgs.hello ];
};

den.aspects.baz.home =
{ pkgs, ... }:
{
home.packages = [ pkgs.direnv ];
};

expr = {
enable = igloo.home-manager.users.tux.programs.fish.enable;
model = igloo.home-manager.users.tux.home.keyboard.model;
enable = tuxHm.programs.fish.enable;
model = tuxHm.home.keyboard.model;
hello = lib.any (p: "hello" == lib.getName p) tuxHm.home.packages;
direnv = lib.any (p: "direnv" == lib.getName p) tuxHm.home.packages;
};
expected = {
enable = true;
model = "storm";
hello = true;
direnv = true;
};
}
);
Expand Down Expand Up @@ -107,6 +128,7 @@
lib,
igloo,
apple,
tuxHm,
...
}:
let
Expand Down Expand Up @@ -134,18 +156,38 @@
den.hosts.aarch64-darwin.apple.users.tux = { };

den.aspects.tux = {
includes = [ forwarded ];
includes = [
forwarded
den.aspects.foo
den.aspects.bar
];
hmLinux.home.keyboard.model = "freedom";
hmDarwin.home.keyboard.model = "closed";
};

den.aspects.foo.hmLinux =
{ pkgs, ... }:
{
home.packages = [ pkgs.hello ];
};

den.aspects.bar.hmLinux =
{ pkgs, ... }:
{
home.packages = [ pkgs.direnv ];
};

expr = {
linux = igloo.home-manager.users.tux.home.keyboard.model;
darwin = apple.home-manager.users.tux.home.keyboard.model;
hello = lib.any (p: "hello" == lib.getName p) tuxHm.home.packages;
direnv = lib.any (p: "direnv" == lib.getName p) tuxHm.home.packages;
};
expected = {
linux = "freedom";
darwin = "closed";
hello = true;
direnv = true;
};
}
);
Expand Down
Loading