From 8ef03a3027f14eca88e2b283d4b70d5a4fcbbde2 Mon Sep 17 00:00:00 2001 From: Benedikt Peetz Date: Sun, 23 Aug 2026 21:48:22 +0200 Subject: nix/module.hm.nix: Init home-manager module --- flake.nix | 13 ++++-- nix/module.hm.nix | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 nix/module.hm.nix diff --git a/flake.nix b/flake.nix index a149b267..5f8584e3 100644 --- a/flake.nix +++ b/flake.nix @@ -4,7 +4,7 @@ crane = { url = "github:ipetkov/crane"; - inputs = { }; + inputs = {}; }; }; @@ -30,7 +30,7 @@ imports = [./tests/basic.nix]; defaults = { imports = [ - module + nixosModule ]; services.turtle.package = test-turtle; environment.systemPackages = [ @@ -39,13 +39,18 @@ }; }; - module = import ./nix/module.nix {extraPackages = {inherit turtle;};}; + nixosModule = import ./nix/module.nix {extraPackages = {inherit turtle;};}; + hmModule = import ./nix/module.hm.nix {turtlePkg = turtle;}; in { packages."${system}" = { inherit turtle; default = self.outputs.packages.${system}.turtle; }; - nixosModules.default = module; + + nixosModules = { + nixos = nixosModule; + home-manager = hmModule; + }; checks."${system}".default = tests; diff --git a/nix/module.hm.nix b/nix/module.hm.nix new file mode 100644 index 00000000..1891abb6 --- /dev/null +++ b/nix/module.hm.nix @@ -0,0 +1,129 @@ +{turtlePkg}: { + config, + pkgs, + lib, + ... +}: let + cfg = config.programs.turtle; + + tomlFormat = pkgs.formats.toml {}; + + inherit + (lib) + mkIf + mkOption + types + ; +in { + options.programs.turtle = { + enable = lib.mkEnableOption "turtle"; + + package = (lib.mkPackageOption pkgs "turtle" {}) // {default = turtlePkg;}; + + settings = mkOption { + type = with types; let + prim = oneOf [ + bool + int + str + ]; + primOrPrimAttrs = either prim (attrsOf prim); + entry = either prim (listOf primOrPrimAttrs); + entryOrAttrsOf = t: either entry (attrsOf t); + entries = entryOrAttrsOf (entryOrAttrsOf entry); + in + attrsOf entries // {description = "Turtle configuration";}; + default = {}; + example = lib.literalExpression '' + { + auto_sync = true; + sync_frequency = "5m"; + sync_address = "https://api.atuin.sh"; + search_mode = "prefix"; + } + ''; + description = '' + Configuration written to + {file}`$XDG_CONFIG_HOME/turtle/config.toml`. + ''; + }; + + daemon = { + logLevel = mkOption { + default = null; + type = types.nullOr ( + types.enum [ + "trace" + "debug" + "info" + "warn" + "error" + ] + ); + description = '' + Verbosity of Turtle daemon logging. + ''; + }; + }; + }; + + config = mkIf cfg.enable { + assertions = [ + { + assertion = config.systemd.user.enable || config.launchd.enable; + message = "The Turtle daemon can only be configured on systems with systemd or launchd."; + } + ]; + + # Always add the configured `turtle` package. + home.packages = [cfg.package]; + + # If there are user-provided settings, generate the config file. + xdg.configFile = lib.mkMerge [ + (mkIf (cfg.settings != {}) { + "turtle/config.toml" = { + source = tomlFormat.generate "turtle-config" cfg.settings; + }; + }) + ]; + + programs.turtle.settings.daemon = { + systemd_socket = config.systemd.user.enable; + socket_path = lib.mkIf (!config.systemd.user.enable) ( + lib.mkDefault "${config.xdg.dataHome}/turtle/daemon.sock" + ); + }; + + systemd.user.services.turtle-daemon = { + Unit = { + Description = "Turtle daemon"; + Requires = ["turtle-daemon.socket"]; + }; + Install = { + Also = ["turtle-daemon.socket"]; + WantedBy = ["default.target"]; + }; + Service = { + ExecStart = "${lib.getExe' cfg.package "turtle-daemon"} start"; + Environment = lib.optionals (cfg.daemon.logLevel != null) ["ATUIN_LOG=${cfg.daemon.logLevel}"]; + Restart = "on-failure"; + RestartSteps = 3; + RestartMaxDelaySec = 6; + }; + }; + + systemd.user.sockets.turtle-daemon = { + Unit = { + Description = "Turtle daemon socket"; + }; + Install = { + WantedBy = ["sockets.target"]; + }; + Socket = { + ListenStream = "%t/turtle.sock"; + SocketMode = "0600"; + RemoveOnStop = true; + }; + }; + }; +} -- cgit v1.3.1