let lib = with import {}; pkgs.lib; profiles = { isDesktopEnvironment = { awesome = true; internetSuite = true; multimediaSuite = true; officeSuite = true; pulseaudio = true; securitySuite = true; }; isWorkstation = { graphical = true; docker = true; }; #isServer = { #}; }; in with lib; rec{ # Apply the profiles (pre-defined + custom) to the whole directory applyProfilesToDirectory = customProfiles: directory: lib.mapAttrs (applyProfilesToMachine customProfiles) directory; # Apply the profiles (pre-defined + custom) to a machine applyProfilesToMachine = customProfiles: machineName: machineOptions: { configuration-flags = lib.recursiveUpdate (generateFlagsSet customProfiles machineOptions.profiles) machineOptions.configuration-flags; ipAddress = machineOptions.ipAddress; tinc = machineOptions.tinc; profiles = machineOptions.profiles; }; # Generate a set of configuration flags based on profiles generateFlagsSet = customProfiles: machineProfiles: let allProfiles = recursiveUpdate profiles customProfiles; conditionalFlags = name: value: if machineProfiles.${name} then value else {}; in foldr (a: b: a // b) {} (mapAttrsToList conditionalFlags allProfiles); }