{ pkgs, lib, config, ... }: let mkStrOption = lib.mkOption { type = lib.types.str; }; mkStrNullOption = lib.mkOption { type = lib.types.nullOr lib.types.str; default = null; }; desktopItems = lib.mapAttrs (name: conf: (pkgs.makeDesktopItem { inherit name; inherit (conf) desktopName exec icon path; }) + "/share/applications/${name}.desktop") config.desktopItems.items; in { options = { desktopItems = { enable = lib.mkEnableOption "desktop items"; items = lib.mkOption { type = lib.types.attrsOf (lib.types.submodule ({ config, ... }: { options = { desktopName = mkStrOption; exec = mkStrOption; icon = mkStrNullOption; path = mkStrNullOption; }; })); default = []; }; }; }; config = lib.mkIf config.desktopItems.enable { home.file = lib.mapAttrs' (name: conf: lib.nameValuePair ".local/share/applications/${name}.desktop" { source = conf; } ) desktopItems; }; }