diff --git a/nix/home-module.nix b/nix/home-module.nix index 785317cda..fb150777a 100644 --- a/nix/home-module.nix +++ b/nix/home-module.nix @@ -3,17 +3,22 @@ lib, pkgs, ... -}: let +}: +let cfg = config.programs.noctalia-shell; - jsonFormat = pkgs.formats.json {}; - generateJson = name: value: + jsonFormat = pkgs.formats.json { }; + tomlFormat = pkgs.formats.toml { }; + + generateJson = + name: value: if lib.isString value then pkgs.writeText "noctalia-${name}.json" value else if builtins.isPath value || lib.isStorePath value then value else jsonFormat.generate "noctalia-${name}.json" value; -in { +in +{ options.programs.noctalia-shell = { enable = lib.mkEnableOption "Noctalia shell configuration"; @@ -25,13 +30,14 @@ in { }; settings = lib.mkOption { - type = with lib.types; + type = + with lib.types; oneOf [ jsonFormat.type str path ]; - default = {}; + default = { }; example = lib.literalExpression '' { bar = { @@ -56,13 +62,14 @@ in { }; colors = lib.mkOption { - type = with lib.types; + type = + with lib.types; oneOf [ jsonFormat.type str path ]; - default = {}; + default = { }; example = lib.literalExpression '' { mError = "#dddddd"; @@ -87,6 +94,36 @@ in { ''; }; + user-templates = lib.mkOption { + default = { }; + type = + with lib.types; + oneOf [ + tomlFormat.type + str + path + ]; + example = lib.literalExpression '' + { + templates = { + neovim = { + inputPath = "~/.config/matugen/templates/template.lua"; + outputPath = "~/.config/nvim/generated.lua"; + postHook = "pkill -SIGUSR1 nvim"; + }; + }; + } + ''; + description = '' + Template definitions for Matugen. + + This option accepts: + - a Nix attrset (converted to TOML automatically) + - a string containing raw TOML + - a path to an existing TOML file + ''; + }; + app2unit.package = lib.mkOption { type = lib.types.package; default = pkgs.app2unit; @@ -96,10 +133,11 @@ in { }; }; - config = let - restart = "${pkgs.systemd}/bin/systemctl --user try-restart noctalia-shell.service 2>/dev/null || true"; - useApp2Unit = cfg.settings.appLauncher.useApp2Unit or false; - in + config = + let + restart = "${pkgs.systemd}/bin/systemctl --user try-restart noctalia-shell.service 2>/dev/null || true"; + useApp2Unit = cfg.settings.appLauncher.useApp2Unit or false; + in lib.mkIf cfg.enable { systemd.user.services.noctalia-shell = lib.mkIf cfg.systemd.enable { Unit = { @@ -108,8 +146,11 @@ in { PartOf = [ config.wayland.systemd.target ]; After = [ config.wayland.systemd.target ]; X-Restart-Triggers = - lib.optional (cfg.settings != {}) config.xdg.configFile."noctalia/settings.json".source - ++ lib.optional (cfg.colors != {}) config.xdg.configFile."noctalia/colors.json".source; + lib.optional (cfg.settings != { }) config.xdg.configFile."noctalia/settings.json".source + ++ lib.optional (cfg.colors != { }) config.xdg.configFile."noctalia/colors.json".source + ++ lib.optional ( + cfg.user-templates != { } + ) config.xdg.configFile."noctalia/user-templates.toml".source; }; Service = { @@ -124,18 +165,26 @@ in { }; home.packages = - lib.optional useApp2Unit cfg.app2unit.package - ++ lib.optional (cfg.package != null) cfg.package; + lib.optional useApp2Unit cfg.app2unit.package ++ lib.optional (cfg.package != null) cfg.package; xdg.configFile = { - "noctalia/settings.json" = lib.mkIf (cfg.settings != {}) { + "noctalia/settings.json" = lib.mkIf (cfg.settings != { }) { onChange = lib.mkIf (!cfg.systemd.enable) restart; source = generateJson "settings" cfg.settings; }; - "noctalia/colors.json" = lib.mkIf (cfg.colors != {}) { + "noctalia/colors.json" = lib.mkIf (cfg.colors != { }) { onChange = lib.mkIf (!cfg.systemd.enable) restart; source = generateJson "colors" cfg.colors; }; + "noctalia/user-templates.toml" = lib.mkIf (cfg.user-templates != { }) { + source = + if lib.isString cfg.user-templates then + pkgs.writeText "noctalia-user-templates.toml" cfg.user-templates + else if builtins.isPath cfg.user-templates || lib.isStorePath cfg.user-templates then + cfg.user-templates + else + tomlFormat.generate "noctalia-user-templates.toml" cfg.user-templates; + }; }; assertions = [