feat(templates): add users-templates config

This commit is contained in:
mochou
2025-12-18 01:23:35 +08:00
parent 4db59c20a0
commit fd7ff2d4c5
+86 -18
View File
@@ -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,55 @@ in {
'';
};
user-templates = lib.mkOption {
type = lib.types.submodule {
options = {
config = lib.mkOption {
type = lib.types.attrsOf lib.types.anything;
default = { };
description = "General [config] section for Matugens TOML config file.";
};
templates = lib.mkOption {
type = lib.types.attrsOf (
lib.types.submodule {
options = {
inputPath = lib.mkOption {
type = lib.types.path;
description = "Template input path for Matugen";
};
outputPath = lib.mkOption {
type = lib.types.path;
description = "Output path where the generated file will be written";
};
postHook = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = "";
description = "Command to run after file is generated";
};
};
}
);
};
};
};
default = { };
example = lib.literalExpression ''
programs.noctalia-shell.user-templates = {
templates = {
neovim = {
inputPath = "~/.config/matugen/templates/template.lua";
outputPath = "~/.config/nvim/generated.lua";
postHook = "pkill -SIGUSR1 nvim";
};
};
};
'';
description = ''
Template definitions for Matugen. Each attribute corresponds to a template
such as "neovim", "kitty", "btop".
'';
};
app2unit.package = lib.mkOption {
type = lib.types.package;
default = pkgs.app2unit;
@@ -96,10 +152,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 +165,8 @@ 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;
};
Service = {
@@ -124,18 +181,29 @@ 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" = {
onChange = lib.mkIf (!cfg.systemd.enable) restart;
source = tomlFormat.generate "user-templates.toml" {
config = cfg.user-templates.config;
templates = lib.mapAttrs (_: t: {
input_path = t.inputPath;
output_path = t.outputPath;
post_hook = t.postHook;
}) cfg.user-templates.templates;
};
};
};
assertions = [