2.home-manager/modules/programs/atool.nix
oneorseveralcats 40955dc50a atool: add module
atool is a commandline archive manager that uses packages like gnutar,
p7zip, unrar, and zip as backends for viewing, creating, and extracting
their corresponding archive formats.
2026-03-26 16:24:39 -05:00

83 lines
2 KiB
Nix

{
config,
lib,
pkgs,
...
}:
let
inherit (lib)
mkOption
types
;
cfg = config.programs.atool;
in
{
meta.maintainers = [ lib.hm.maintainers.oneorseveralcats ];
options.programs.atool = {
enable = lib.mkEnableOption "atool a commandline archive manager.";
package = lib.mkPackageOption pkgs "atool" { nullable = true; };
finalPackage = mkOption {
type = types.package;
readOnly = true;
description = ''
Final atool package bundled with extraPackages.
'';
};
settings = mkOption {
type = with types; attrsOf (either str int);
default = { };
example = {
path_unrar = "unrar-free";
};
description = ''
atool settings to generate {file}`~/.atoolrc`.
'';
};
extraPackages = mkOption {
type = types.listOf types.package;
default = [ ];
example = lib.literalExpression ''
# all supported archive backends
with pkgs; [ bzip2 cpio gnutar gzip lhasa lzop p7zip unrar-free unzip xz zip ]
'';
description = "Extra packages for atool.";
};
};
config =
let
atoolPackage =
if (cfg.extraPackages != [ ]) then
(pkgs.symlinkJoin {
name = "atool-wrapped";
paths = [ cfg.package ];
buildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/atool \
--suffix PATH : ${lib.makeBinPath cfg.extraPackages}
'';
})
else
cfg.package;
in
lib.mkIf cfg.enable {
programs.atool.finalPackage = atoolPackage;
home.packages = lib.mkIf (cfg.package != null) [
cfg.finalPackage
];
home.file.".atoolrc" = lib.mkIf (cfg.settings != { }) {
source = pkgs.writeText ".atoolrc" (
lib.generators.toKeyValue {
mkKeyValue = lib.generators.mkKeyValueDefault { } " ";
} cfg.settings
);
};
};
}