ooknet/modules/nixos/hardware/options.nix

117 lines
2.7 KiB
Nix

{
lib,
config,
...
}: let
inherit (builtins) filter length head;
inherit (lib) mkOption mkEnableOption;
inherit (lib.types) nullOr enum bool submodule listOf int str;
cfg = config.ooknet.hardware;
hasMonitors = length cfg.monitors != 0;
primaryAttr = filter (m: m.primary or false) cfg.monitors;
primaryCount = length primaryAttr;
in {
options.ooknet.hardware = {
gpu = {
type = mkOption {
type = nullOr (enum ["intel" "amd" "nvidia"]);
default = null;
};
};
cpu = {
type = mkOption {
type = nullOr (enum ["intel" "amd"]);
default = null;
};
amd.pstate.enable = mkEnableOption "";
cores = mkOption {
type = int;
description = "Number of Physical CPU cores the system has";
};
threads = mkOption {
type = int;
description = "Number of cpu threads the cpu has";
};
};
features = mkOption {
type = listOf (enum [
"audio"
"video"
"bluetooth"
"backlight"
"battery"
"ssd"
"printing"
"fingerprint"
]);
default = ["ssd"];
};
# monitor module inspired by misterio77
# includes the addition of transform option
primaryMonitor = mkOption {
type = nullOr str;
default =
if !hasMonitors
then null
else (head primaryAttr).name;
description = "Name of the primary monitor, derived from the monitors list";
readOnly = true;
};
monitors = mkOption {
type = listOf (submodule {
options = {
name = mkOption {
type = str;
example = "DP-1";
};
primary = mkOption {
type = bool;
default = false;
};
width = mkOption {
type = int;
example = 1920;
};
height = mkOption {
type = int;
example = 1080;
};
refreshRate = mkOption {
type = int;
default = 60;
};
x = mkOption {
type = int;
default = 0;
};
y = mkOption {
type = int;
default = 0;
};
transform = mkOption {
type = int;
default = 0;
};
enabled = mkOption {
type = bool;
default = true;
};
};
});
default = [];
};
};
config = {
assertions = [
{
assertion = hasMonitors -> primaryCount == 1;
message = "Error: config.ooknet.hardware.monitors. When monitors are configured, exactly one monitor must be designated as primary (found ${toString primaryCount} primary monitors)";
}
];
};
}