nix/home/util/murex.nix
atagen 7485de646a current
linted
2025-02-02 17:07:42 +11:00

85 lines
2 KiB
Nix

{
lib,
config,
...
}:
let
inherit (lib)
mkEnableOption
mkOption
mkIf
types
;
inherit (builtins) listToAttrs;
cfg = config.programs.murex;
in
{
options.programs.murex = {
enable = mkEnableOption "murex shell";
managePlugins = mkEnableOption "plugin management";
direnv = mkEnableOption "direnv integration";
plugins = mkOption {
type = with types; listOf package;
default = [ ];
};
profile = mkOption {
type = types.str;
default = "";
};
preload = mkOption {
type = types.str;
default = "";
};
useXdgConfig = mkEnableOption "override MUREX_{PRELOAD,MODULES,PROFILE} env vars to conform to XDG_CONFIG_HOME";
};
config = mkIf cfg.enable {
home.file =
let
plugins = listToAttrs (
map (plugin: {
name = ".murex_modules/${plugin.pname}";
value = {
recursive = true;
source = plugin;
};
}) cfg.plugins
);
in
lib.mergeAttrs plugins {
".murex_preload" = {
text = cfg.preload;
executable = true;
enable = cfg.preload != "";
};
".murex_profile" = {
text =
cfg.profile
+ (
if cfg.direnv then
''
direnv hook murex -> source
''
else
""
);
executable = true;
enable = cfg.direnv || cfg.profile != "";
};
".murex_modules/packages.json" = {
text = builtins.toJSON (
map (plugin: {
Protocol = "nix";
URI = "nix://managed.git";
Package = plugin.pname;
}) cfg.plugins
);
enable = cfg.managePlugins && (cfg.plugins != [ ]);
};
};
home.sessionVariables = mkIf cfg.useXdgConfig {
MUREX_PRELOAD = "$XDG_CONFIG_HOME/murex/";
MUREX_MODULES = "$XDG_CONFIG_HOME/murex/";
MUREX_PROFILE = "$XDG_CONFIG_HOME/murex/";
};
};
}