{ lib, config, pkgs, ... }: let cfg = config.this.sets; attrFromPath' = (path: attrs: (lib.hasAttrByPath path attrs) && (lib.getAttrFromPath path attrs)); doSets = (sets: let recur = (path: a: if (builtins.typeOf a) == "set" then builtins.attrValues (builtins.mapAttrs (k: v: recur (path++[k]) v) a) else lib.optionals (attrFromPath' path cfg) a ); in lib.flatten (recur [] sets)); in { options.this.sets = { anime.sub = lib.mkEnableOption "package set"; arch.tools = lib.mkEnableOption "package set"; cli.tools.minimal = lib.mkEnableOption "package set" // { default = cfg.cli.tools.full; }; cli.tools.full = lib.mkEnableOption "package set"; cli.shell = lib.mkEnableOption "package set"; comm.im = lib.mkEnableOption "package set"; de.utils = lib.mkEnableOption "package set"; dev.grammars = lib.mkEnableOption "package set"; dl.tools.manga = lib.mkEnableOption "package set" // { default = cfg.dl.tools.full; }; dl.tools.minimal = lib.mkEnableOption "package set" // { default = cfg.dl.tools.full; }; dl.tools.full = lib.mkEnableOption "package set"; gui.tools.minimal = lib.mkEnableOption "package set" // { default = cfg.gui.tools.full; }; gui.tools.full = lib.mkEnableOption "package set"; gui.theme = lib.mkEnableOption "package set"; gui.fonts = lib.mkEnableOption "package set"; image.utils = lib.mkEnableOption "package set"; image.tools = lib.mkEnableOption "package set"; jp.study = lib.mkEnableOption "package set"; mail.tools = lib.mkEnableOption "package set"; media.tools.minimal = lib.mkEnableOption "package set" // { default = cfg.media.tools.full; }; media.tools.full = lib.mkEnableOption "package set"; net.tools.minimal = lib.mkEnableOption "package set" // { default = cfg.net.tools.full; }; net.tools.full = lib.mkEnableOption "package set"; script.utils = lib.mkEnableOption "package set"; sound.tools = lib.mkEnableOption "package set"; sync.tools = lib.mkEnableOption "package set"; sys.tools = lib.mkEnableOption "package set"; writing.tools = lib.mkEnableOption "package set"; www.browser = lib.mkEnableOption "package set"; wine.base = lib.mkEnableOption "package set"; gui.usePicom = lib.mkEnableOption "picom package" // { default = true; }; gui.useEmoji = lib.mkEnableOption "emoji font package" // { default = true; }; de.useKeymapper = lib.mkEnableOption "keymapper" // { default = true; }; }; config = { environment.systemPackages = with pkgs; doSets { anime.sub = [ ffsubsync mkvtoolnix-cli ]; arch.tools = [ p7zip unrar-free unzip zip ]; cli.tools.minimal = [ pv wget ]; cli.tools.full = [ darkhttpd git lftp gnumake jq rsync sshfs tmux ]; cli.shell = [ fzf ]; comm.im = [ gajim ]; de.utils = [ aspell feh libnotify pass ] ++ lib.optional cfg.de.useKeymapper keymapper; dev.grammars = [ (emacsPackages.treesit-grammars.with-grammars (p: with p; [ tree-sitter-c tree-sitter-c-sharp tree-sitter-cmake tree-sitter-cpp tree-sitter-css tree-sitter-dockerfile tree-sitter-elixir tree-sitter-go tree-sitter-gomod tree-sitter-heex tree-sitter-html tree-sitter-java tree-sitter-javascript tree-sitter-json tree-sitter-lua tree-sitter-perl tree-sitter-php tree-sitter-python tree-sitter-ruby tree-sitter-rust tree-sitter-toml tree-sitter-tsx tree-sitter-yaml ]))]; dl.tools.manga = [ gallery-dl img2pdf ]; dl.tools.minimal = [ aria2 ]; gui.tools.minimal = [ autocutsel rxvt-unicode unclutter-xfixes ]; gui.tools.full = [ arandr redshift screenkey tigervnc x11vnc ]; gui.theme = [ adwaita-icon-theme papirus-icon-theme pywal xsettingsd ] ++ lib.optional cfg.gui.usePicom picom; image.utils = [ imagemagick ]; image.tools = [ gimp inkscape ]; jp.study = [ anki mecab ]; mail.tools = [ cyrus-sasl-xoauth2 isync msmtp mu oauth2token w3m ]; media.tools.minimal = [ mpv yt-dlp ]; media.tools.full = [ beets exiftool ffmpeg ]; net.tools.minimal = [ host traceroute whois ]; net.tools.full = [ nmap ]; script.utils = [ espeak-ng firejail ruby xdg-user-dirs ]; sound.tools = [ alsa-tools pulseaudio pulsemixer ]; sync.tools = [ git-annex mr ]; sys.tools = [ lm_sensors lsof pciutils usbutils vim ]; writing.tools = [ pandoc proselint ]; wine.base = [ wineWow64Packages.base winetricks ]; www.browser = [ fuse fuse.dev stdenv.cc ]; }; programs.mosh.enable = cfg.cli.tools.full; programs.zsh = { enable = cfg.cli.shell; syntaxHighlighting.enable = cfg.cli.shell; }; programs.gnupg.agent = { enable = cfg.de.utils; pinentryPackage = pkgs.pinentry-qt; }; programs.firefox = { enable = cfg.www.browser; package = pkgs.firefox-esr; nativeMessagingHosts.packages = lib.optional cfg.de.utils pkgs.passff-host; }; fonts.packages = lib.optionals cfg.gui.fonts ( lib.optional cfg.gui.useEmoji pkgs.noto-fonts-emoji ++ lib.optional (builtins.elem "jp" config.this.locales.all) pkgs.noto-fonts-cjk-sans ++ lib.optionals (!config.this.main.enable) [ pkgs.dejavu_fonts pkgs.unifont ]); fonts.enableDefaultPackages = lib.mkIf cfg.gui.fonts false; }; }