{ lib, config, ... }: let # --- Program metadata --- programName = "kitty"; # Change per module enableProgram = config.enableKitty or true; # Reference toggle safely username = config.defaultUser or "henrov"; # Resolve user safely # --- Assets --- programAssets = ../../../assets/system/conf/${programName}; programFiles = builtins.readDir programAssets; # Map each file → attrset for easy deployment files = lib.genAttrs (builtins.attrNames programFiles) (name: { src = "${programAssets}/${name}"; }); in { # --- Top-level toggle for this module --- options.enableKitty = lib.mkEnableOption "Enable kitty terminal"; # --- Actual configuration (applied only if enabled) --- config = lib.mkIf enableProgram { # Dendritic container: all program config under myApps myApps.${programName} = { enable = true; user = username; assetsDir = programAssets; files = files; # Program-specific metadata theme = "catppuccin-mocha"; }; # Deploy asset files for Home Manager users home-manager.users.${username} = { programs.kitty.enable = true; xdg.configFile = lib.mapAttrs' (name: value: { name = "kitty/${name}"; value.source = value.src; }) files; }; # Example: systemd service if this program needed a sync or install process # (Remove or adapt if unnecessary) systemd.services.${programName}-sync = { description = "Sync ${programName} configuration"; wantedBy = [ "multi-user.target" ]; wants = [ "network-online.target" ]; after = [ "network-online.target" ]; serviceConfig = { Type = "oneshot"; ExecStart = '' set -euo pipefail CONF="${programAssets}" # Example loop over files; adapt per program for f in ${programAssets}/*; do echo "Processing $f..." done ''; }; restartTriggers = [ programAssets ]; path = [ pkgs.coreutils pkgs.gnugrep pkgs.gnused ]; }; }; }