Files
nyi-fetch/nix/settings.nix
T

256 lines
6.1 KiB
Nix
Executable File

{ lib }:
let
inherit (lib) types mkOption;
infoFields = [
"os"
"host"
"kernel"
"uptime"
"packages"
"shell"
"display"
"wm"
"theme"
"icons"
"font"
"cursor"
"terminal"
"cpu"
"gpu"
"memory"
"swap"
"disk"
"ip"
"battery"
"locale"
"colors"
];
colorDoc = ''
Accepts `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`,
or a raw ANSI number such as `"38;5;213"`.
'';
in
rec {
inherit infoFields;
options = {
info = mkOption {
type = types.listOf (types.enum infoFields);
default = infoFields;
example = [
"os"
"kernel"
"uptime"
"cpu"
"memory"
];
description = ''
info fields to display, in the order given. Only the fields listed
here are shown.
'';
};
labelColor = mkOption {
type = types.str;
default = "magenta";
example = "38;5;213";
description = "color used for info labels. " + colorDoc;
};
separator = mkOption {
type = types.str;
default = "-";
description = ''
String repeated to draw the underline below the `user@host` title.
Set to `""` to leave the line blank.
'';
};
box = mkOption {
type = types.bool;
default = false;
description = "Draw a Unicode border box around the info block.";
};
shading = mkOption {
type = types.nullOr types.str;
default = null;
example = ".,-~:;=!*#$@";
description = ''
Shading ramp, dimmest character first. Supports UTF-8. Setting this
implies the `ascii` shading mode.
'';
};
shadingMode = mkOption {
type = types.nullOr (
types.enum [
"ascii"
"blocks"
"sextants"
]
);
default = null;
description = ''
`ascii` (the default) maps brightness onto the character ramp.
`blocks` samples a 2x2 grid per cell and `sextants` a 2x3 one, for
sharper edges. Sextants need a terminal that draws the Symbols for
Legacy Computing block (kitty, Ghostty, foot, NewTerm).
'';
};
logoOuter = mkOption {
type = types.nullOr types.str;
default = null;
example = "magenta";
description = ''
color of the extruded sides, for logos that carry no ANSI colors of
their own. ''
+ colorDoc;
};
logoInner = mkOption {
type = types.nullOr types.str;
default = null;
example = "white";
description = "color of the front and back faces. " + colorDoc;
};
light = mkOption {
type = types.nullOr (
types.enum [
"top-left"
"top-right"
"top"
"left"
"right"
"front"
"bottom-left"
"bottom-right"
]
);
default = null;
description = "light direction for the 3D shading.";
};
spin = mkOption {
type = types.nullOr (
types.enum [
"x"
"y"
"xy"
]
);
default = null;
description = "axes the logo rotates around.";
};
speed = mkOption {
type = types.nullOr types.float;
default = null;
description = "rotation speed multiplier. Higher is faster.";
};
size = mkOption {
type = types.nullOr types.float;
default = null;
description = "logo scale, from 0.5 to 5.0.";
};
height = mkOption {
type = types.nullOr types.int;
default = null;
description = ''
render height in rows. left unset, nyi matches the number of info
lines.
'';
};
depth = mkOption {
type = types.nullOr types.float;
default = null;
description = ''
3D extrusion depth, 0.1 to 10.0. left unset nyi scales it
from the logo's character variance so flat logos don't look
paper-thin.
'';
};
disks = mkOption {
type = types.listOf types.str;
default = [ ];
example = [
"/home"
"/data"
];
description = ''
extra mount points to report beyond `/`, up to 8. Setting any turns
the `disk` field on even if it isn't in {option}`info`.
'';
};
logo = mkOption {
type = types.nullOr types.lines;
default = null;
description = ''
custom ASCII/Unicode logo, written to `nyi/logo.txt`. Denser
characters (`@`, `M`, `#`) become taller in the relief.
'';
};
logoDistro = mkOption {
type = types.nullOr types.str;
default = null;
example = "nixos";
description = ''
distro name whose color scheme {option}`logo` should use, emitted as
the `# distro:` hint line. Ignored unless {option}`logo` is set.
'';
};
extraConfig = mkOption {
type = types.lines;
default = "";
description = ''
extra lines appended verbatim to the generated config file, for
settings this module doesn't cover yet.
'';
};
};
/*
the generated config file lines come first so their order is the
display order; settings are order-independent to the parser.
*/
render =
cfg:
let
settings = lib.filterAttrs (_: v: v != null) {
label_color = cfg.labelColor;
separator = cfg.separator;
box = if cfg.box then "1" else "0";
shading = cfg.shading;
shading_mode = cfg.shadingMode;
logo_outer = cfg.logoOuter;
logo_inner = cfg.logoInner;
light = cfg.light;
spin = cfg.spin;
speed = if cfg.speed != null then toString cfg.speed else null;
size = if cfg.size != null then toString cfg.size else null;
height = if cfg.height != null then toString cfg.height else null;
depth = if cfg.depth != null then toString cfg.depth else null;
};
in
lib.concatStringsSep "\n" (
cfg.info ++ map (d: "disk=${d}") cfg.disks ++ lib.mapAttrsToList (k: v: "${k}=${v}") settings
)
+ "\n"
+ cfg.extraConfig;
renderLogo =
cfg: lib.optionalString (cfg.logoDistro != null) "# distro: ${cfg.logoDistro}\n" + cfg.logo;
}