Files
dotfiles/lib/default.nix
alexion d0e77ed6a3 Scope in-file comments to the current file state (task 0001)
Address PR review feedback: in-file comments should describe only what the
file currently is, not task numbers, external tooling, or past/future states.

- hosts/neogaia: drop the "replaced by disko in task 0002" / "arrive in later
  tasks" framing; describe the filesystems and hardware profile as the
  placeholder values they are.
- lib: drop the "no null-placeholder traversal hack" comparison to a prior
  implementation.
- system: drop "no impure environment lookup" from the user.name description
  and the sops/post-boot roadmap from the user comment.
2026-07-19 07:57:21 -04:00

84 lines
2.2 KiB
Nix

{
lib,
inputs,
self,
}:
let
inherit (lib)
attrNames
filterAttrs
genAttrs
flatten
hasSuffix
mapAttrsToList
;
# --- Auto-loader ---------------------------------------------------------
# Recursively collect every `.nix` file under `dir`, returned as a flat list
# of paths suitable for a module `imports`: a directory recurses, a `.nix`
# file is taken, anything else is skipped.
collectNixFiles =
dir:
flatten (
mapAttrsToList (
name: type:
let
path = dir + "/${name}";
in
if type == "directory" then
collectNixFiles path
else if type == "regular" && hasSuffix ".nix" name then
[ path ]
else
[ ]
) (builtins.readDir dir)
);
# --- Host-builder --------------------------------------------------------
# Build one Host: every Module is imported unconditionally (inert until its
# `enable` flag is set), alongside home-manager, chaotic, the shared base,
# and the Host's own directory.
mkHost =
{
hostName,
system ? "x86_64-linux",
}:
inputs.nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = {
inherit inputs;
my = self.lib;
};
modules =
(collectNixFiles (self + "/modules"))
++ [
inputs.home-manager.nixosModules.home-manager
inputs.chaotic.nixosModules.default
(self + "/system")
(self + "/hosts/${hostName}")
{ networking.hostName = hostName; }
];
};
# Discover every Host (a subdirectory of `hostsDir`) and build each one.
mkHosts =
hostsDir:
let
hostNames = attrNames (filterAttrs (_name: type: type == "directory") (builtins.readDir hostsDir));
in
genAttrs hostNames (hostName: mkHost { inherit hostName; });
# --- Script-from-file helper --------------------------------------------
# Turn a standalone script file into a package on PATH, keeping the script
# itself editable as a real file rather than an inlined heredoc.
scriptFromFile = pkgs: name: path: pkgs.writeShellScriptBin name (builtins.readFile path);
in
{
inherit
collectNixFiles
mkHost
mkHosts
scriptFromFile
;
}