Skip to content

Commit

Permalink
nix: get rid of with lib; and inherit explicitly
Browse files Browse the repository at this point in the history
  • Loading branch information
NotAShelf committed Jun 4, 2024
1 parent 26d4a72 commit 1af8887
Showing 1 changed file with 68 additions and 60 deletions.
128 changes: 68 additions & 60 deletions nix/hm-module.nix
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,28 @@ self: {
cfg = config.programs.anyrun;

defaultPackage = self.packages.${pkgs.stdenv.hostPlatform.system}.default;

inherit (builtins) map toJSON toString substring stringLength;
inherit (lib.modules) mkIf mkMerge;
inherit (lib.options) mkOption mkEnableOption literalExpression;
inherit (lib.lists) optional;
inherit (lib.attrsets) mapAttrs' nameValuePair;
inherit (lib.strings) toLower toUpper replaceStrings;
inherit (lib.trivial) boolToString;
inherit (lib.types) nullOr package submodule int float listOf either str enum lines bool attrs;
in {
meta.maintainers = with lib.maintainers; [n3oney NotAShelf];

options.programs.anyrun = with lib; {
options.programs.anyrun = {
enable = mkEnableOption "anyrun";

package = mkOption {
type = with types; nullOr package;
type = nullOr package;
default = defaultPackage;
defaultText = lib.literalExpression ''
defaultText = literalExpression ''
anyrun.packages.''${pkgs.stdenv.hostPlatform.system}.default
'';
description = mdDoc ''
description = ''
Anyrun package to use. Defaults to the one provided by the flake.
'';
};
Expand All @@ -30,27 +39,26 @@ in {
description,
...
}:
with types;
mkOption {
inherit default description;
example = ''
{ absolute = 200; };
or
{ fraction = 0.4; };
'';
type = submodule {
options = {
absolute = mkOption {
type = nullOr int;
default = null;
};
fraction = mkOption {
type = nullOr float;
default = null;
};
mkOption {
inherit default description;
example = ''
{ absolute = 200; };
or
{ fraction = 0.4; };
'';
type = submodule {
options = {
absolute = mkOption {
type = nullOr int;
default = null;
};
fraction = mkOption {
type = nullOr float;
default = null;
};
};
};
};

numericInfo = ''
This is a numeric option - pass either `{ absolute = int; };` or `{ fraction = float; };`.
Expand All @@ -59,16 +67,16 @@ in {
'';
in {
plugins = mkOption {
type = with types; nullOr (listOf (either package str));
type = nullOr (listOf (either package str));
default = null;
description = mdDoc ''
description = ''
List of anyrun plugins to use. Can either be packages, absolute plugin paths, or strings.
'';
};

x = mkNumericOption {
default.fraction = 0.5;
description = mdDoc ''
description = ''
The horizontal position, adjusted so that { relative = 0.5; } always centers the runner.
${numericInfo}
Expand All @@ -77,7 +85,7 @@ in {

y = mkNumericOption {
default.fraction = 0.0;
description = mdDoc ''
description = ''
The vertical position, works the same as x.
${numericInfo}
Expand All @@ -86,7 +94,7 @@ in {

width = mkNumericOption {
default.absolute = 800;
description = mdDoc ''
description = ''
The width of the runner.
${numericInfo}
Expand All @@ -95,71 +103,71 @@ in {

height = mkNumericOption {
default.absolute = 0;
description = mdDoc ''
description = ''
The minimum height of the runner, the runner will expand to fit all the entries.
${numericInfo}
'';
};

hideIcons = mkOption {
type = types.bool;
type = bool;
default = false;
description = "Hide match and plugin info icons";
};

ignoreExclusiveZones = mkOption {
type = types.bool;
type = bool;
default = false;
description = "ignore exclusive zones, eg. Waybar";
};

layer = mkOption {
type = with types; enum ["background" "bottom" "top" "overlay"];
type = enum ["background" "bottom" "top" "overlay"];
default = "overlay";
description = "Layer shell layer (background, bottom, top or overlay)";
};

hidePluginInfo = mkOption {
type = types.bool;
type = bool;
default = false;
description = "Hide the plugin info panel";
};

closeOnClick = mkOption {
type = types.bool;
type = bool;
default = false;
description = "Close window when a click outside the main box is received";
};

showResultsImmediately = mkOption {
type = types.bool;
type = bool;
default = false;
description = "Show search results immediately when Anyrun starts";
};

maxEntries = mkOption {
type = with types; nullOr int;
type = nullOr int;
default = null;
description = "Limit amount of entries shown in total";
};
};

extraCss = lib.mkOption {
type = lib.types.nullOr lib.types.lines;
extraCss = mkOption {
type = nullOr lines;
default = "";
description = mdDoc ''
description = ''
Extra CSS lines to add to {file}`~/.config/anyrun/style.css`.
'';
};

extraConfigFiles = lib.mkOption {
extraConfigFiles = mkOption {
# unfortunately HM doesn't really export the type for files, but hopefully
# hm will throw errors if the options are wrong here, so I'm being *very* loose
type = lib.types.attrs;
type = attrs;
default = {};
description = mdDoc ''
Extra files to put in `~/.config/anyrun`, a wrapper over `xdg.configFile`.
description = ''
Extra files to put in {file}`~/.config/anyrun`, a wrapper over {option}`xdg.configFile`.
'';
example = ''
programs.anyrun.extraConfigFiles."plugin-name.ron".text = '''
Expand All @@ -171,27 +179,27 @@ in {
};
};

config = lib.mkIf cfg.enable (let
config = mkIf cfg.enable (let
assertNumeric = numeric: {
assertion = !((numeric ? absolute && numeric.absolute != null) && (numeric ? fraction && numeric.fraction != null));
message = "Invalid numeric definition, you can only specify one of absolute or fraction.";
};

stringifyNumeric = numeric:
if (numeric ? absolute && numeric.absolute != null)
then "Absolute(${builtins.toString numeric.absolute})"
else "Fraction(${builtins.toString numeric.fraction})";
then "Absolute(${toString numeric.absolute})"
else "Fraction(${toString numeric.fraction})";

capitalize = string:
lib.toUpper (builtins.substring 0 1 string) + lib.toLower (builtins.substring 1 ((builtins.stringLength string) - 1) string);
toUpper (substring 0 1 string) + toLower (substring 1 ((stringLength string) - 1) string);

parsedPlugins =
if cfg.config.plugins == null
then []
else
builtins.map (entry:
map (entry:
if lib.types.package.check entry
then "${entry}/lib/lib${lib.replaceStrings ["-"] ["_"] entry.pname}.so"
then "${entry}/lib/lib${replaceStrings ["-"] ["_"] entry.pname}.so"
else entry)
cfg.config.plugins;
in {
Expand All @@ -207,11 +215,11 @@ in {
]
else [];

home.packages = lib.optional (cfg.package != null) cfg.package;
home.packages = optional (cfg.package != null) cfg.package;

xdg.configFile = lib.mkMerge [
(lib.mapAttrs'
(name: value: lib.nameValuePair ("anyrun/" + name) value)
xdg.configFile = mkMerge [
(mapAttrs'
(name: value: nameValuePair ("anyrun/" + name) value)
cfg.extraConfigFiles)

{
Expand All @@ -221,24 +229,24 @@ in {
y: ${stringifyNumeric cfg.config.y},
width: ${stringifyNumeric cfg.config.width},
height: ${stringifyNumeric cfg.config.height},
hide_icons: ${lib.boolToString cfg.config.hideIcons},
ignore_exclusive_zones: ${lib.boolToString cfg.config.ignoreExclusiveZones},
hide_icons: ${boolToString cfg.config.hideIcons},
ignore_exclusive_zones: ${boolToString cfg.config.ignoreExclusiveZones},
layer: ${capitalize cfg.config.layer},
hide_plugin_info: ${lib.boolToString cfg.config.hidePluginInfo},
close_on_click: ${lib.boolToString cfg.config.closeOnClick},
show_results_immediately: ${lib.boolToString cfg.config.showResultsImmediately},
hide_plugin_info: ${boolToString cfg.config.hidePluginInfo},
close_on_click: ${boolToString cfg.config.closeOnClick},
show_results_immediately: ${boolToString cfg.config.showResultsImmediately},
max_entries: ${
if cfg.config.maxEntries == null
then "None"
else "Some(${builtins.toString cfg.config.maxEntries})"
else "Some(${toString cfg.config.maxEntries})"
},
plugins: ${builtins.toJSON parsedPlugins},
plugins: ${toJSON parsedPlugins},
)
'';
}

{
"anyrun/style.css" = lib.mkIf (cfg.extraCss != null) {
"anyrun/style.css" = mkIf (cfg.extraCss != null) {
text = cfg.extraCss;
};
}
Expand Down

0 comments on commit 1af8887

Please sign in to comment.