diff --git a/modules/misc/news/2025-04-20_20-12-03.nix b/modules/misc/news/2025-04-20_20-12-03.nix new file mode 100644 index 000000000..bd5c1b767 --- /dev/null +++ b/modules/misc/news/2025-04-20_20-12-03.nix @@ -0,0 +1,9 @@ +{ + time = "2025-04-21T01:12:03+00:00"; + condition = true; + message = '' + A new module is available: 'programs.clock-rs'. + + clock-rs is a modern, digital clock that effortlessly runs in your terminal. + ''; +} diff --git a/modules/modules.nix b/modules/modules.nix index e992e43d0..0e55e5eed 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -86,6 +86,7 @@ let ./programs/cavalier.nix ./programs/chawan.nix ./programs/chromium.nix + ./programs/clock-rs.nix ./programs/cmus.nix ./programs/command-not-found/command-not-found.nix ./programs/comodoro.nix diff --git a/modules/programs/clock-rs.nix b/modules/programs/clock-rs.nix new file mode 100644 index 000000000..1030422c2 --- /dev/null +++ b/modules/programs/clock-rs.nix @@ -0,0 +1,62 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + cfg = config.programs.clock-rs; + tomlFormat = pkgs.formats.toml { }; +in +{ + meta.maintainers = with lib.maintainers; [ oughie ]; + + options.programs.clock-rs = { + enable = lib.mkEnableOption "clock-rs"; + + package = lib.mkPackageOption pkgs "clock-rs" { nullable = true; }; + + settings = lib.mkOption { + type = tomlFormat.type; + default = { }; + description = "The configuration file to be used for clock-rs"; + example = lib.literalExpression '' + general = { + color = "magenta"; + interval = 250; + blink = true; + bold = true; + }; + + position = { + horizontal = "start"; + vertical = "end"; + }; + + date = { + fmt = "%A, %B %d, %Y"; + use_12h = true; + utc = true; + hide_seconds = true; + }; + ''; + }; + }; + + config = lib.mkIf cfg.enable { + home = + let + configDir = + if pkgs.stdenv.hostPlatform.isDarwin then "Library/Application Support" else config.xdg.configHome; + in + { + packages = lib.mkIf (cfg.package != null) [ cfg.package ]; + + file."${configDir}/clock-rs/conf.toml" = lib.mkIf (cfg.settings != { }) { + source = tomlFormat.generate "clock-rs-config" cfg.settings; + }; + }; + }; + +} diff --git a/tests/default.nix b/tests/default.nix index 48d3a2671..def1c3f34 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -353,6 +353,7 @@ import nmtSrc { ./modules/programs/btop ./modules/programs/carapace ./modules/programs/cava + ./modules/programs/clock-rs ./modules/programs/cmus ./modules/programs/comodoro ./modules/programs/darcs diff --git a/tests/modules/programs/clock-rs/default.nix b/tests/modules/programs/clock-rs/default.nix new file mode 100644 index 000000000..e87e8a8f0 --- /dev/null +++ b/tests/modules/programs/clock-rs/default.nix @@ -0,0 +1,4 @@ +{ + clock-rs-example-settings = ./example-settings.nix; + clock-rs-empty-settings = ./empty-settings.nix; +} diff --git a/tests/modules/programs/clock-rs/empty-settings.nix b/tests/modules/programs/clock-rs/empty-settings.nix new file mode 100644 index 000000000..fc51bc0ae --- /dev/null +++ b/tests/modules/programs/clock-rs/empty-settings.nix @@ -0,0 +1,20 @@ +{ pkgs, ... }: +{ + config = { + programs.clock-rs.enable = true; + + tests.stubs.clock-rs = { }; + + nmt.script = + let + configDir = + if pkgs.stdenv.isDarwin then + "home-files/Library/Application Support/clock-rs" + else + "home-files/.config/clock-rs"; + in + '' + assertPathNotExists "${configDir}/conf.toml" + ''; + }; +} diff --git a/tests/modules/programs/clock-rs/example-settings-expected.toml b/tests/modules/programs/clock-rs/example-settings-expected.toml new file mode 100644 index 000000000..b532d5bea --- /dev/null +++ b/tests/modules/programs/clock-rs/example-settings-expected.toml @@ -0,0 +1,15 @@ +[date] +fmt = "%A, %B %d, %Y" +hide_seconds = true +use_12h = true +utc = true + +[general] +blink = true +bold = true +color = "magenta" +interval = 250 + +[position] +horizontal = "start" +vertical = "end" diff --git a/tests/modules/programs/clock-rs/example-settings.nix b/tests/modules/programs/clock-rs/example-settings.nix new file mode 100644 index 000000000..df9cad268 --- /dev/null +++ b/tests/modules/programs/clock-rs/example-settings.nix @@ -0,0 +1,42 @@ +{ pkgs, ... }: +{ + config = { + programs.clock-rs = { + enable = true; + settings = { + general = { + color = "magenta"; + interval = 250; + blink = true; + bold = true; + }; + + position = { + horizontal = "start"; + vertical = "end"; + }; + + date = { + fmt = "%A, %B %d, %Y"; + use_12h = true; + utc = true; + hide_seconds = true; + }; + }; + }; + + nmt.script = + let + configDir = + if pkgs.stdenv.isDarwin then + "home-files/Library/Application Support/clock-rs" + else + "home-files/.config/clock-rs"; + in + '' + assertFileExists "${configDir}/conf.toml" + assertFileContent "${configDir}/conf.toml" \ + ${./example-settings-expected.toml} + ''; + }; +}