{ lib, inputs, secrets, dotfiles, hosts, hardwares, systems, isNixOS, isMacOS, isIso, isHardware, user, nixpkgs, home-manager, nix-darwin, ... }:
let
mkHost = { host, hardware, stateVersion, system, timezone, location, extraOverlays, extraModules }: isNixOS: isMacOS: isIso: isHardware:
let
pkgs = import nixpkgs {
inherit system;
config = {
allowUnfree = true;
allowBroken = true;
allowUnsupportedSystem = true;
};
overlays = [
inputs.nur.overlay
# inputs.neovim-nightly-overlay.overlay
(import ../packages)
(import ../overlays)
] ++ extraOverlays;
};
extraArgs = { inherit pkgs inputs isIso isHardware user secrets dotfiles timezone location hardware system stateVersion; hostname = host + "-" + hardware; };
extraSpecialModules = extraModules ++ lib.optional isHardware ../hardware/${hardware} ++ lib.optional isIso "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix";
in
if isNixOS
then
nixpkgs.lib.nixosSystem
{
inherit system;
specialArgs = extraArgs;
modules = [
./configuration.nix
./${host}
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = extraArgs;
home-manager.users.${user} = {
imports = [
./home.nix
./${ host }/home.nix
];
};
}
] ++ extraSpecialModules;
}
else if isMacOS
then
nix-darwin.lib.darwinSystem
{
inherit system;
specialArgs = extraArgs;
modules = [
./darwin.nix
home-manager.darwinModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.extraSpecialArgs = extraArgs;
home-manager.users."manuel.palenzuela" = {
imports = [
./home-darwin.nix
];
};
}
];
}
else
home-manager.lib.homeManagerConfiguration
{
inherit pkgs;
extraSpecialArgs = extraArgs;
modules = [
./home.nix
./${ host }/home.nix
];
};
hardwarePermutatedHosts = lib.concatMap (hardware: map (host: host // hardware) hosts) hardwares;
systemsPermutatedHosts = lib.concatMap (system: map (host: host // system) hardwarePermutatedHosts) systems;
permutatedHosts = systemsPermutatedHosts;
in
/*
We have a list of sets.
Map each element of the list applying the mkHost function to its elements and returning a set in the listToAttrs format
builtins.listToAttrs on the result
*/
builtins.listToAttrs (map (mInput@{ host, hardware, system, ... }: { name = host + "-" + hardware + "-" + system; value = mkHost mInput isNixOS isMacOS isIso isHardware; }) permutatedHosts)