{ config, pkgs, lib, ... }: let inherit (lib) mkEnableOption mkPackageOption mkOption mkIf getExe types ; inherit (types) attrsOf bool; name = "Niri Tag Manager"; in { options.services.niri-tag = { enable = mkEnableOption name; package = mkPackageOption pkgs name { nullable = true; default = "niri-tag"; }; prepopulate = mkOption { type = types.numbers.between 0 255; default = 3; }; scratchpads = mkOption { type = attrsOf (types.numbers.between 1 255); default = { }; }; strict = mkOption { type = bool; default = true; }; }; config = let cfg = config.services.niri-tag; in mkIf (cfg.enable) { systemd.user.services.niri-tag = { enable = true; description = name; wantedBy = [ "graphical-session.target" ]; partOf = [ "graphical-session.target" ]; after = [ "niri.service" ]; wants = [ "niri.service" ]; serviceConfig = { Type = "notify"; Restart = "always"; ExecStart = "${getExe cfg.package}"; PrivateTmp = true; }; }; environment.etc."niri-tag/config.toml".text = let scratchpads = let contents = lib.mapAttrsToList (app: number: "${app} = ${toString number}") cfg.scratchpads |> lib.concatStringsSep "\n"; in lib.optionalString ((lib.attrsToList cfg.scratchpads |> builtins.length) > 0) '' [scratchpads] ${contents} ''; in '' prepopulate = ${toString cfg.prepopulate} strict = ${lib.boolToString cfg.strict} ${scratchpads} ''; environment.systemPackages = [ cfg.package ]; }; }