diff --git a/modules/modules.nix b/modules/modules.nix index 13f739bc..2d62416d 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -304,6 +304,7 @@ let ./programs/watson.nix ./programs/waylogout.nix ./programs/waybar.nix + ./programs/wayprompt.nix ./programs/wezterm.nix ./programs/wlogout.nix ./programs/wofi.nix diff --git a/modules/programs/wayprompt.nix b/modules/programs/wayprompt.nix new file mode 100644 index 00000000..42145c91 --- /dev/null +++ b/modules/programs/wayprompt.nix @@ -0,0 +1,69 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + cfg = config.programs.wayprompt; + + # Matches 6-hex-digit RGB or 8-hex-digit RGBA values + colourHexPattern = "^[0-9a-fA-F]{6}([0-9a-fA-F]{2})?$"; + + isColourHex = str: builtins.match colourHexPattern str != null; + + iniFormat = pkgs.formats.ini { + mkKeyValue = lib.generators.mkKeyValueDefault { + mkValueString = + v: + if lib.isString v then + (if isColourHex v then "0x${lib.strings.toUpper v};" else ''"${v}";'') + else + lib.generators.mkValueStringDefault { } v + ";"; + } " = "; + }; +in +{ + meta.maintainers = [ lib.maintainers.panchoh ]; + + options.programs.wayprompt = { + enable = lib.mkEnableOption "Wayprompt, a password-prompter for Wayland"; + + package = lib.mkPackageOption pkgs "wayprompt" { nullable = true; }; + + settings = lib.mkOption { + inherit (iniFormat) type; + default = { }; + example = lib.literalExpression '' + { + general = { + font-regular = "sans:size=14"; + pin-square-amount = 32; + }; + colours = { + background = "0xffffffaa"; + }; + } + ''; + description = '' + Configuration for wayprompt written to + {file}`$XDG_CONFIG_HOME/wayprompt/config.ini`. + See {manpage}`wayprompt(5)` for a list of available options. + Note that colours can be either 6-hex-digit RGB or 8-hex-digit RGBA values. + ''; + }; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + (lib.hm.assertions.assertPlatform "programs.wayprompt" pkgs lib.platforms.linux) + ]; + + home.packages = lib.mkIf (cfg.package != null) [ cfg.package ]; + + xdg.configFile."wayprompt/config.ini" = lib.mkIf (cfg.settings != { }) { + source = iniFormat.generate "config.ini" cfg.settings; + }; + }; +} diff --git a/tests/default.nix b/tests/default.nix index f42fc404..269043b3 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -397,6 +397,7 @@ import nmtSrc { ./modules/programs/vesktop ./modules/programs/vinegar ./modules/programs/waybar + ./modules/programs/wayprompt ./modules/programs/wlogout ./modules/programs/wofi ./modules/programs/xmobar diff --git a/tests/modules/programs/wayprompt/default.nix b/tests/modules/programs/wayprompt/default.nix new file mode 100644 index 00000000..477cb57f --- /dev/null +++ b/tests/modules/programs/wayprompt/default.nix @@ -0,0 +1,4 @@ +{ + wayprompt-empty-settings = ./empty-settings.nix; + wayprompt-example-settings = ./example-settings.nix; +} diff --git a/tests/modules/programs/wayprompt/empty-settings.nix b/tests/modules/programs/wayprompt/empty-settings.nix new file mode 100644 index 00000000..20ad7b52 --- /dev/null +++ b/tests/modules/programs/wayprompt/empty-settings.nix @@ -0,0 +1,7 @@ +{ + programs.wayprompt.enable = true; + + nmt.script = '' + assertPathNotExists home-files/.config/wayprompt + ''; +} diff --git a/tests/modules/programs/wayprompt/example-settings-expected.ini b/tests/modules/programs/wayprompt/example-settings-expected.ini new file mode 100644 index 00000000..0466629d --- /dev/null +++ b/tests/modules/programs/wayprompt/example-settings-expected.ini @@ -0,0 +1,8 @@ +[band] +sunrise = 0xF7CD5D; +sunset = 0xFAD6A5; +white-with-alpha = 0xFFFFFF00; + +[group] +some-integer = 42; +some-string = "foo:bar=37"; diff --git a/tests/modules/programs/wayprompt/example-settings.nix b/tests/modules/programs/wayprompt/example-settings.nix new file mode 100644 index 00000000..a05d49bc --- /dev/null +++ b/tests/modules/programs/wayprompt/example-settings.nix @@ -0,0 +1,29 @@ +{ + config, + ... +}: + +{ + programs.wayprompt = { + enable = true; + package = config.lib.test.mkStubPackage { }; + settings = { + group = { + some-integer = 42; + some-string = "foo:bar=37"; + }; + band = { + sunrise = "F7CD5D"; + sunset = "fad6a5"; + white-with-alpha = "ffffff00"; + }; + }; + }; + + nmt.script = '' + local configFile=home-files/.config/wayprompt/config.ini + + assertFileExists $configFile + assertFileContent $configFile ${./example-settings-expected.ini} + ''; +}