feat(nix): refine meta module options for users and hosts

This commit is contained in:
Mohammad Rafiq 2025-07-08 23:53:42 +08:00
parent df06e092d6
commit dd74ed210c
No known key found for this signature in database

View file

@ -5,17 +5,53 @@
...
}:
let
inherit (lib.options) mkOption;
inherit (lib.options) mkOption mkEnableOption;
inherit (cfg.lib.options) mkStrOption;
inherit (lib.types)
listOf
path
lazyAttrsOf
raw
deferredModule
submodule
;
inherit (inputs.flake-parts.lib) mkSubmoduleOptions;
inherit (cfg.lib.attrsets) firstAttrNameMatching;
cfg = config.flake;
username = firstAttrNameMatching (_: v: v.primary or false) cfg.manifest.users;
userOpts = submodule {
options = {
username = mkStrOption "";
primary = mkEnableOption "";
name = mkStrOption "";
email = mkStrOption "";
shell = mkStrOption "";
pubkey = mkStrOption "";
};
};
hostOpts = submodule {
options = {
graphical = mkEnableOption "";
machine = {
platform = mkStrOption "";
gpu = mkStrOption "";
root.drive = mkStrOption "";
monitors = mkOption {
type = listOf submodule {
options = {
id = mkStrOption "";
scale = mkStrOption "";
resolution = mkStrOption "";
refresh-rate = mkStrOption "";
};
};
};
};
extraCfg = mkOption {
type = deferredModule;
default = { };
};
};
};
in
{
options.flake = mkSubmoduleOptions {
@ -30,19 +66,39 @@ in
readOnly = true;
};
};
admin = mkOption {
type = lazyAttrsOf raw;
default = { };
};
homes = mkOption {
type = lazyAttrsOf deferredModule;
default = { };
};
};
config.flake = {
paths.secrets = cfg.paths.root + "/secrets";
admin = cfg.manifest.users.${username} // {
inherit username;
manifest = mkOption {
type = submodule {
options = {
users = mkOption {
type = lazyAttrsOf userOpts;
default = { };
};
hosts = mkOption {
# hosts.nixos, hosts.darwin, etc.
type = lazyAttrsOf (lazyAttrsOf hostOpts);
default = { };
};
};
};
};
# Helper Option
admin = mkOption {
type = userOpts;
default = { };
};
};
config.flake =
let
username = firstAttrNameMatching (_: v: v.primary or false) cfg.manifest.users;
in
{
paths.secrets = cfg.paths.root + "/secrets";
admin = cfg.manifest.users.${username} // {
inherit username;
};
};
}