let # Recursively collect directories collectDirs = path: let content = builtins.readDir path; subdirs = builtins.filter (name: content.${name} == "directory") (builtins.attrNames content); buildPath = name: path + "/${name}"; # Get immediate subdirectories thisDirs = map buildPath subdirs; # Recursively get sub-subdirectories subDirs = builtins.concatMap collectDirs thisDirs; in [ path ] ++ subDirs; # Import directories and their default.nix files directoryImport = path: builtins.listToAttrs ( map (dir: { name = baseNameOf (toString dir); value = import dir; }) (collectDirs path) ); # Create the modules attrset modules = directoryImport ./.; in { flake.homeModules = { desktop = { imports = builtins.attrValues { inherit (modules) cli gui ; }; }; laptop = { imports = builtins.attrValues { inherit (modules) apps ; }; }; server = { imports = builtins.attrValues { inherit (modules) cli ; }; }; }; }