{ lib, ... }: let inherit (lib) mkOption types; in { imports = [ ./programs.nix ]; options = { valhalla = mkOption { type = types.submodule ( { config, ... }: let optionalAttrs = lib.attrsets.optionalAttrs; cfg = config; inherit (cfg.software) coding desktopExperience essential gaming server socialMedia; mkPrograms = programs: builtins.foldl' ( programs: name: programs // { ${name}.enable = true; } ) { } programs; in { options = { software = { essential = mkOption { type = types.bool; description = "A value indicating whether essentials should be installed."; default = false; }; server = mkOption { type = types.bool; description = "A value indicating whether server applications should be installed."; default = false; }; desktopExperience = mkOption { type = types.bool; description = "A value indicating whether GUI apps should be installed."; default = false; }; school = mkOption { type = types.bool; description = "A value indicating whether software for studies should be installed."; default = false; }; productivity = mkOption { type = types.bool; description = "A value indicating whether productivity apps should be installed."; default = false; }; socialMedia = mkOption { type = types.bool; description = "A value indicating whether social media apps should be installed."; default = false; }; media = mkOption { type = types.bool; description = "A value indicating whether media apps should be installed."; default = false; }; gaming = mkOption { type = types.bool; description = "A value indicating whether gaming apps should be installed."; default = false; }; coding = mkOption { type = types.bool; description = "A value indicating whether development apps should be installed."; default = false; }; }; }; config = { programs = (optionalAttrs essential (mkPrograms [ "aliae" "git" "oh-my-posh" "openssh" "powershell" "zoxide" ])) // (optionalAttrs desktopExperience (mkPrograms [ "brave" "firefox" "pennywise" "thunderbird" ])) // (optionalAttrs socialMedia (mkPrograms [ "discord" ])) // (optionalAttrs coding (mkPrograms [ "docker" "vscode" ])) // (optionalAttrs gaming (mkPrograms [ "osu!lazer" "retroarch" "steam" ])); linux.programs = (optionalAttrs essential (mkPrograms [ "bash" "logo-ls" "minegrub-theme" "nuke-usb" "vim" ])) // (optionalAttrs desktopExperience (mkPrograms [ "icedtea" "plasma" "sddm" "waydroid" "virt-manager" ])) // (optionalAttrs coding (mkPrograms [ "nodejs-n" "pyenv" ])) // (optionalAttrs gaming (mkPrograms [ "lutris" ])) // (optionalAttrs server (mkPrograms [ "nginx" ])); # Essentials windows.programs = (optionalAttrs essential (mkPrograms [ "posh-git" "terminal-icons" # Desktop Experience ])) // (optionalAttrs desktopExperience (mkPrograms [ "msedge-redirect" "putty" "winscp" # Development ])) // (optionalAttrs coding (mkPrograms [ "nvs" "visualstudio" # Gaming ])) // (optionalAttrs gaming (mkPrograms [ "maniaplanet" "osu!" "rewasd" "tm-nations-forever" "tm-united-forever" ])); }; } ); }; }; }