Skip to content

Commit

Permalink
refactor: remove outputsForTarget
Browse files Browse the repository at this point in the history
  • Loading branch information
GTrunSec committed Sep 29, 2023
1 parent f0b0f42 commit 909ba6f
Show file tree
Hide file tree
Showing 13 changed files with 135 additions and 236 deletions.
8 changes: 4 additions & 4 deletions examples/haumea.nix
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ let
self: super: {
exports.mergedOutputs =
with dmerge;
merge self.outputsForTarget.default {
merge self.outputs.default {
treefmt.formatter.prettier.includes = append [ "*.jsl" ];
data.foo = "barzf";
};
Expand Down Expand Up @@ -65,7 +65,7 @@ let
[
(extendPop pops.exporter (
self: super: {
exports.customModules = self.outputsForTarget.dmerge {
exports.customModules = self.outputs.dmerge {
config.services.openssh.enable = false;
config.services.openssh.customList = [ "1" ];
imports = with dmerge; append [ ];
Expand All @@ -77,8 +77,8 @@ let
evalModules = l.evalModules {
modules = [
g.exports.customModules.services.openssh
g.outputsForTarget.default.programs.emacs
g.outputsForTarget.default.programs.git
g.outputs.default.programs.emacs
g.outputs.default.programs.git
];
};

Expand Down
27 changes: 0 additions & 27 deletions src/haumea/__targetOutputs.nix

This file was deleted.

90 changes: 55 additions & 35 deletions src/haumea/nixosModules.nix
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@ let
));
base =
{
attrs ? { },
dmergePath ? [ ],
extenders ? [ ],
}:
haumea.lib.load {
inherit (cfg) src inputs;
Expand All @@ -55,6 +54,7 @@ let
let
mkModulePath =
attrs': l.setAttrByPath (relModulePathWithoutDefault path) attrs';
test = config._module.args.pkgs or { };
baseModuleArgs =
(
inputs
Expand All @@ -64,35 +64,67 @@ let
cfg = l.attrByPath (relModulePathWithoutDefault path) { } config;
opt = l.attrByPath (relModulePathWithoutDefault path) { } options;
inherit mkModulePath;
}
// l.optionals (cfg.type == "nixosModules" || cfg.type == "nixosProfiles") {
moduleArgs = config._module.args // config._module.specialArgs;
}
// l.optionalAttrs (cfg == "nixosModules" || cfg.type == "nixosProfiles") {
pkgs = config._module.args.pkgs;
}
)
);

moduleArgs = baseModuleArgs // {
loadSubmodule =
path:
(x: mkDmergeModule (winnow path x lib.id)) (
builtins.scopedImport baseModuleArgs path
);
path: (mkExtenders (builtins.scopedImport baseModuleArgs path) path);
};

# reset the options to the demerged module
mkDmergeModule = x: x // (dmergeModuleFun (removeAttrs x [ "options" ]));
callArgsLazily =
attrs: extraArgs:
if (l.isFunction attrs) then
lazyArgsPerParameter attrs (moduleArgs // extraArgs)
else
attrs
;

s3 = callModuleLazily moduleArgs path;
# => { config = { }; imports = [... ]; _file }
s3Module = (mkDmergeModule (winnow path s3 mkModulePath));
s3Profile = mkDmergeModule s3;
s3final =
let
s3Module = mkExtenders (winnow path s3 mkModulePath) path;
s3Profile = mkExtenders s3;
in
if cfg.type == "nixosModules" then s3Module else s3Profile;

mkExtenders =
module: path:
let
removedOptionModule = removeAttrs module [ "options" ];
filteredList =
l.filter (item: item.path == (trace (relModulePathWithoutDefault path)))
extenders;

foundItem =
if (builtins.length filteredList) > 0 then
(builtins.head filteredList)
else
[ ]
;

loadExtendModuleFromValue =
if foundItem != [ ] then
(callArgsLazily foundItem.value {
self = module;
# add the options back in
# dmerge self' {}
self' = x: module // (x removedOptionModule);
# add dmerge support
inherit dmerge;
})
else
module
;
in
loadExtendModuleFromValue;

dmergeModuleFun =
module:
if ((relModulePathWithoutDefault path) == dmergePath) then
(dmerge module attrs')
else
module
;
winnow =
path: module: fun:
({
Expand All @@ -114,9 +146,8 @@ let
options = fun module.options or { };
}
;
attrs' = if (l.isFunction attrs) then attrs moduleArgs else attrs;
in
if cfg.type == "nixosModules" then s3Module else s3Profile;
s3final;
in
module
);
Expand All @@ -130,18 +161,7 @@ let
in
{
default = base { };
dmerge =
attrs: path:
l.getAttrFromPath path (
base {
inherit attrs;
dmergePath = path;
}
);
__extenders = extenders: base { inherit extenders; };
}
// (
if (cfg.type == "nixosModules") then
{ nixosModules = base { }; }
else
{ nixosProfiles = base { }; }
)
// l.optionalAttrs (cfg.type == "nixosModules") { nixosModules = base { }; }
// l.optionalAttrs (cfg.type == "nixosProfiles") { nixosProfiles = base { }; }
93 changes: 33 additions & 60 deletions src/haumea/pops.nix
Original file line number Diff line number Diff line change
Expand Up @@ -42,39 +42,25 @@ let
};
};

targetExtender = pop {
defaults = {
outputsForTarget = { };
};
outputsExtender = pop {
defaults = { };
extension = self: super: {
setTargetOutputs =
outputsForTarget: extendPop self (self: super: { inherit outputsForTarget; });

addTargetExtender = targetExtender: self.addTargetExtenders [ targetExtender ];
addTargetExtenders =
targetExtenders:
addOutputsExtender =
outputExtender: self.addOutputsExtenders [ outputExtender ];
addOutputsExtenders =
outputsExtenders:
extendPop self (
self: super: { targetExtenders = super.targetExtenders ++ targetExtenders; }
self: super: { outputsExtenders = super.outputsExtenders ++ outputsExtenders; }
);
};
};

nixosModulesExtender = pop {
defaults = {
imports = [ ];
};
extension = self: super: {
setOutputsForTarger =
(outputsForTarget: extendPop self (self: super: { inherit outputsForTarget; }));
};
};

exporter = pop {
defaults = {
exports = { };
loadCfg = { };
};
supers = [ targetExtender ];
supers = [ outputsExtender ];
extension = self: super: {
setLoad =
defun
Expand Down Expand Up @@ -115,7 +101,6 @@ let
default = pop {
supers = [
loadExtender
nixosModulesExtender
exporter
];
defaults = {
Expand All @@ -131,17 +116,14 @@ let
(
acc: extender:
let
ex' =
((extender.setOutputs self.outputsForTarget.default).setTargetOutputs
self.outputsForTarget
);
ex' = (extender.setOutputs self.outputs);
in
acc // ex'.exports
)
{ }
self.exporters;
in
generalExporters // self.outputsForTarget;
generalExporters;
# -- exportersExtener --
addExporter = exporter: self.addExporters [ exporter ];
addExporters =
Expand Down Expand Up @@ -196,38 +178,29 @@ let
# laziest way to get the outputs
# default is to merge the outputs with dmerege
outputs =
defun
(
with types; [
(either function (attrs any))
(attrs any)
]
)
(
x:
if l.isFunction x then
x self.outputsForTarget.default
else if x != { } then
dmerge.merge self.outputsForTarget.default x
else
self.outputsForTarget.default
);
outputsForTarget =
let
cfg = (exporter.setLoad self.loadCfg).loadCfg;
haumeaOutputs =
if (cfg.type == "nixosModules" || cfg.type == "nixosProfiles") then
nixosModules { inherit cfg; }
else
{ default = haumea.lib.load (l.removeAttrs cfg [ "type" ]); }
;
targetOutputs = import ./__targetOutputs.nix {
inherit (cfg) type;
inherit haumeaOutputs;
inherit self lib;
};
in
haumeaOutputs;
(
let
cfg = (exporter.setLoad self.loadCfg).loadCfg;
haumeaOutputs =
if (cfg.type == "nixosModules" || cfg.type == "nixosProfiles") then
nixosModules { inherit cfg; }
else
{ default = haumea.lib.load (l.removeAttrs cfg [ "type" ]); }
;
in
haumeaOutputs
// (l.optionalAttrs (!haumeaOutputs ? __extenders) {
__extender =
x:
if l.isFunction x then
x self.outputs.default
else if x != { } then
dmerge.merge self.outputs.default x
else
self.outputs.default
;
})
);
};
};
in
Expand Down
1 change: 1 addition & 0 deletions src/haumea/structAttrs.nix
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ let
"nixosModules"
"default"
"nixosProfiles"
"evalModules"
]
"type";
};
Expand Down
4 changes: 2 additions & 2 deletions templates/default/flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@
in
{
eval = nixpkgs.lib.evalModules {
modules = [ self.loadModules.outputsForTarget.default.programs.git ];
modules = [ self.loadModules.outputs.default.programs.git ];
};

nixos = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [ self.loadModules.outputsForTarget.default.programs.git ];
modules = [ self.loadModules.outputs.default.programs.git ];
};
loadModules = flops.lib.haumea.pops.default.setInit {
src = ./nixosModules;
Expand Down
19 changes: 2 additions & 17 deletions tests/_snapshots/evalModules
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,11 @@
programs = {
git = {
__profiles__ = {
enable = true;
name = "John Doe";
enable = false;
name = "guangtao";
};
};
};
services = {
openssh = {
customList = [
"a"
"1"
];
customList2 = [ ];
customList3 = [ ];
customList4 = [
"mkMerge"
];
enable = false;
enableCustom = false;
};
};
};
default = {
programs = {
Expand Down
Loading

0 comments on commit 909ba6f

Please sign in to comment.