diff --git a/modules/misc/news/2025/11/2025-11-15_09-54-20.nix b/modules/misc/news/2025/11/2025-11-15_09-54-20.nix new file mode 100644 index 000000000..fd7a1b549 --- /dev/null +++ b/modules/misc/news/2025/11/2025-11-15_09-54-20.nix @@ -0,0 +1,13 @@ +{ pkgs, ... }: + +{ + time = "2025-11-15T08:54:20+00:00"; + condition = pkgs.stdenv.hostPlatform.isLinux; + message = '' + A new module is available: 'programs.bluetuith'. + + bluetuith is a TUI-based Bluetooth connection manager, which can interact + with Bluetooth adapters and devices. It aims to be a replacement to most + Bluetooth managers, like blueman. + ''; +} diff --git a/modules/programs/bluetuith.nix b/modules/programs/bluetuith.nix new file mode 100644 index 000000000..849ff5513 --- /dev/null +++ b/modules/programs/bluetuith.nix @@ -0,0 +1,61 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + cfg = config.programs.bluetuith; + + jsonFormat = pkgs.formats.json { }; +in +{ + meta.maintainers = with lib.hm.maintainers; [ + poseidon-rises + ]; + + options.programs.bluetuith = { + enable = lib.mkEnableOption "Bluetuith"; + + package = lib.mkPackageOption pkgs "bluetuith" { nullable = true; }; + + settings = lib.mkOption { + type = jsonFormat.type; + default = { }; + example = lib.literalExpression '' + { + adapter = "hci0"; + receive-dir = "/home/user/files"; + + keybindings = { + Menu = "Alt+m"; + }; + + theme = { + Adapter = "red"; + }; + } + ''; + description = '' + Configuration written to + {file}`$XDG_CONFIG_HOME/bluetuith/bluetuith.conf`. + + See for + details. + ''; + }; + }; + + config = lib.mkIf cfg.enable { + assertions = [ + (lib.hm.assertions.assertPlatform "programs.bluetuith" pkgs lib.platforms.linux) + ]; + + home.packages = lib.mkIf (cfg.package != null) [ cfg.package ]; + + xdg.configFile."bluetuith/bluetuith.conf" = lib.mkIf (cfg.settings != { }) { + source = jsonFormat.generate "bluetuith.conf" cfg.settings; + }; + }; +} diff --git a/tests/modules/programs/bluetuith/default.nix b/tests/modules/programs/bluetuith/default.nix new file mode 100644 index 000000000..53fc9dd55 --- /dev/null +++ b/tests/modules/programs/bluetuith/default.nix @@ -0,0 +1,5 @@ +{ lib, pkgs, ... }: +lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux { + bluetuith-empty-settings = ./empty-settings.nix; + bluetuith-example-settings = ./example-settings.nix; +} diff --git a/tests/modules/programs/bluetuith/empty-settings.nix b/tests/modules/programs/bluetuith/empty-settings.nix new file mode 100644 index 000000000..593627b2e --- /dev/null +++ b/tests/modules/programs/bluetuith/empty-settings.nix @@ -0,0 +1,13 @@ +{ config, ... }: +{ + config = { + programs.bluetuith = { + enable = true; + package = config.lib.test.mkStubPackage { }; + }; + + nmt.script = '' + assertPathNotExists home-files/.config/bluetuith + ''; + }; +} diff --git a/tests/modules/programs/bluetuith/example-settings.nix b/tests/modules/programs/bluetuith/example-settings.nix new file mode 100644 index 000000000..cf8a676ca --- /dev/null +++ b/tests/modules/programs/bluetuith/example-settings.nix @@ -0,0 +1,25 @@ +{ + programs.bluetuith = { + enable = true; + + settings = { + adapter = "hci0"; + receive-dir = "/home/user/files"; + + keybindings = { + Menu = "Alt-m"; + }; + + theme = { + Adapter = "red"; + }; + }; + }; + + nmt.script = '' + assertFileContent \ + "home-files/.config/bluetuith/bluetuith.conf" \ + ${./expected-settings-output.conf} + ''; + +} diff --git a/tests/modules/programs/bluetuith/expected-settings-output.conf b/tests/modules/programs/bluetuith/expected-settings-output.conf new file mode 100644 index 000000000..fb3d7fa71 --- /dev/null +++ b/tests/modules/programs/bluetuith/expected-settings-output.conf @@ -0,0 +1,10 @@ +{ + "adapter": "hci0", + "keybindings": { + "Menu": "Alt-m" + }, + "receive-dir": "/home/user/files", + "theme": { + "Adapter": "red" + } +}