49 lines
1.3 KiB
Nix
49 lines
1.3 KiB
Nix
{ lib, config, inputs, ... }:
|
|
|
|
let
|
|
username = config.defaultUser or "henrov";
|
|
|
|
modulesPath = ./generated/modules;
|
|
moduleSwitches = builtins.fromJSON (builtins.readFile ./assets/system/conf/modules.json);
|
|
importedModules = inputs.import-tree modulesPath;
|
|
|
|
# Keep only enabled modules
|
|
enabledModules = lib.filterAttrs (name: _: moduleSwitches.${name} or false)
|
|
importedModules.imports;
|
|
|
|
moduleList = builtins.attrValues enabledModules;
|
|
|
|
# Recursive evaluator: forces functions → attrsets
|
|
forceAttrs = val:
|
|
if builtins.isFunction val then
|
|
forceAttrs (val {})
|
|
else if builtins.isAttrs val then
|
|
lib.mapAttrs (_: v: forceAttrs v) val
|
|
else if builtins.isList val then
|
|
map forceAttrs val
|
|
else
|
|
val;
|
|
|
|
# Extract fragment safely
|
|
safeFragment = m:
|
|
let frag =
|
|
if builtins.hasAttr "homeManagerExtraUserFragment" m
|
|
then m.homeManagerExtraUserFragment
|
|
else {};
|
|
in forceAttrs frag;
|
|
|
|
# Merge all fragments
|
|
mergedFragments = lib.foldl' lib.mkMerge {} (map safeFragment moduleList);
|
|
|
|
in {
|
|
networking.hostName = "traveldroid";
|
|
system.stateVersion = "26.05";
|
|
|
|
home-manager.users = {
|
|
"${username}" = mergedFragments;
|
|
};
|
|
|
|
# Bonus: list all imported module files
|
|
traveldroidModules = builtins.attrNames enabledModules;
|
|
}
|