From 6573392c3b598e470b6a65f7a0c7c67ecf0f7692 Mon Sep 17 00:00:00 2001 From: Danilo Reyes Date: Fri, 16 Jan 2026 13:40:44 -0600 Subject: [PATCH] Refactor user option types across modules for consistency Updated multiple configuration files to replace the user option type with a unified `usersOptionType`, enhancing consistency in user management across applications and services. This change simplifies the user configuration process and improves maintainability. --- config/stylix.nix | 3 +-- modules/apps/art.nix | 3 +-- modules/apps/dictionaries.nix | 3 +-- modules/apps/gaming.nix | 3 +-- modules/apps/internet.nix | 3 +-- modules/apps/misc.nix | 3 +-- modules/apps/multimedia.nix | 6 ++---- modules/apps/music.nix | 3 +-- modules/apps/office.nix | 3 +-- modules/dev/cc.nix | 3 +-- modules/dev/docker.nix | 3 +-- modules/dev/emacs.nix | 3 +-- modules/dev/go.nix | 3 +-- modules/dev/haskell.nix | 3 +-- modules/dev/javascript.nix | 3 +-- modules/dev/julia.nix | 3 +-- modules/dev/nix.nix | 3 +-- modules/dev/python.nix | 3 +-- modules/dev/ruby.nix | 3 +-- modules/dev/rust.nix | 3 +-- modules/dev/sh.nix | 3 +-- modules/dev/zig.nix | 3 +-- modules/factories/mkscript.nix | 3 +-- modules/services/printing.nix | 3 +-- modules/shell/config.nix | 3 +-- modules/shell/exercism.nix | 3 +-- modules/shell/multimedia.nix | 3 +-- modules/shell/tools.nix | 3 +-- parts/core.nix | 21 ++++++++++++++------- 29 files changed, 43 insertions(+), 65 deletions(-) diff --git a/config/stylix.nix b/config/stylix.nix index 3fabeb6..a69118a 100644 --- a/config/stylix.nix +++ b/config/stylix.nix @@ -17,9 +17,8 @@ in options.my.stylix = { enable = lib.mkEnableOption "system-wide theming with Stylix"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.stylix; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to apply Stylix theming for"; }; }; diff --git a/modules/apps/art.nix b/modules/apps/art.nix index 685bb79..0c714fb 100644 --- a/modules/apps/art.nix +++ b/modules/apps/art.nix @@ -40,9 +40,8 @@ in apps.art = { enable = lib.mkEnableOption "digital art and creative applications"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.apps; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install art packages for"; }; }; diff --git a/modules/apps/dictionaries.nix b/modules/apps/dictionaries.nix index 143dee8..4601da4 100644 --- a/modules/apps/dictionaries.nix +++ b/modules/apps/dictionaries.nix @@ -21,9 +21,8 @@ in options.my.apps.dictionaries = { enable = lib.mkEnableOption "dictionaries and language tools"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.apps; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install dictionaries packages for"; }; }; diff --git a/modules/apps/gaming.nix b/modules/apps/gaming.nix index c680e57..23173db 100644 --- a/modules/apps/gaming.nix +++ b/modules/apps/gaming.nix @@ -26,9 +26,8 @@ in gaming = { enable = lib.mkEnableOption "gaming applications and emulators"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.apps; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install gaming packages for"; }; }; diff --git a/modules/apps/internet.nix b/modules/apps/internet.nix index ba7261a..d3a4a54 100644 --- a/modules/apps/internet.nix +++ b/modules/apps/internet.nix @@ -31,9 +31,8 @@ in options.my.apps.internet = { enable = lib.mkEnableOption "internet browsers and communication apps"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.apps; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install internet packages for"; }; }; diff --git a/modules/apps/misc.nix b/modules/apps/misc.nix index 0fc1103..77b9c46 100644 --- a/modules/apps/misc.nix +++ b/modules/apps/misc.nix @@ -9,9 +9,8 @@ options.my.apps.misc = { enable = lib.mkEnableOption "miscellaneous desktop applications"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.apps; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install misc packages for"; }; }; diff --git a/modules/apps/multimedia.nix b/modules/apps/multimedia.nix index 8456c5f..c5aa611 100644 --- a/modules/apps/multimedia.nix +++ b/modules/apps/multimedia.nix @@ -33,17 +33,15 @@ in options.my.apps.multimedia = { enable = lib.mkEnableOption "multimedia applications and media players"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.apps; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install multimedia packages for"; }; videoEditing = { enable = lib.mkEnableOption "video editing applications"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.apps; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install video editing packages for"; }; }; diff --git a/modules/apps/music.nix b/modules/apps/music.nix index 9b625b7..c3e1833 100644 --- a/modules/apps/music.nix +++ b/modules/apps/music.nix @@ -9,9 +9,8 @@ options.my.apps.piano = { enable = lib.mkEnableOption "piano learning and music theory apps"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.apps; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install piano packages for"; }; }; diff --git a/modules/apps/office.nix b/modules/apps/office.nix index 5c2e766..5ba5fb1 100644 --- a/modules/apps/office.nix +++ b/modules/apps/office.nix @@ -9,9 +9,8 @@ options.my.apps.office = { enable = lib.mkEnableOption "office applications and productivity tools"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.apps; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install office packages for"; }; }; diff --git a/modules/dev/cc.nix b/modules/dev/cc.nix index b679fb0..811437a 100644 --- a/modules/dev/cc.nix +++ b/modules/dev/cc.nix @@ -21,9 +21,8 @@ in my.dev.cc = { enable = lib.mkEnableOption "Install C/C++ tooling globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install C/C++ packages for"; }; }; diff --git a/modules/dev/docker.nix b/modules/dev/docker.nix index 5f0662d..4313f64 100644 --- a/modules/dev/docker.nix +++ b/modules/dev/docker.nix @@ -18,9 +18,8 @@ in my.dev.docker = { enable = lib.mkEnableOption "Install Docker tooling globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install Docker packages for"; }; }; diff --git a/modules/dev/emacs.nix b/modules/dev/emacs.nix index 809aa0b..4e60c9a 100644 --- a/modules/dev/emacs.nix +++ b/modules/dev/emacs.nix @@ -9,9 +9,8 @@ options.my.emacs = { enable = lib.mkEnableOption "Doom Emacs configuration"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install Emacs packages for"; }; }; diff --git a/modules/dev/go.nix b/modules/dev/go.nix index 5554927..c808ecc 100644 --- a/modules/dev/go.nix +++ b/modules/dev/go.nix @@ -24,9 +24,8 @@ in my.dev.go = { enable = lib.mkEnableOption "Install Go tooling globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install Go packages for"; }; }; diff --git a/modules/dev/haskell.nix b/modules/dev/haskell.nix index b142864..945c57c 100644 --- a/modules/dev/haskell.nix +++ b/modules/dev/haskell.nix @@ -22,9 +22,8 @@ in my.dev.haskell = { enable = lib.mkEnableOption "Install Haskell tooling globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install Haskell packages for"; }; }; diff --git a/modules/dev/javascript.nix b/modules/dev/javascript.nix index 1f2fde7..2a79749 100644 --- a/modules/dev/javascript.nix +++ b/modules/dev/javascript.nix @@ -16,9 +16,8 @@ in my.dev.javascript = { enable = lib.mkEnableOption "Install JavaScript tooling globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install JavaScript packages for"; }; }; diff --git a/modules/dev/julia.nix b/modules/dev/julia.nix index 2d30333..96c6831 100644 --- a/modules/dev/julia.nix +++ b/modules/dev/julia.nix @@ -15,9 +15,8 @@ in my.dev.julia = { enable = lib.mkEnableOption "Install Julia globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install Julia packages for"; }; }; diff --git a/modules/dev/nix.nix b/modules/dev/nix.nix index 1e36ae8..b8b2c51 100644 --- a/modules/dev/nix.nix +++ b/modules/dev/nix.nix @@ -22,9 +22,8 @@ in my.dev.nix = { enable = lib.mkEnableOption "Install Nix tooling globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install Nix packages for"; }; }; diff --git a/modules/dev/python.nix b/modules/dev/python.nix index add8db7..2ea3741 100644 --- a/modules/dev/python.nix +++ b/modules/dev/python.nix @@ -34,9 +34,8 @@ in my.dev.python = { enable = lib.mkEnableOption "Install Python tools globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install Python packages for"; }; }; diff --git a/modules/dev/ruby.nix b/modules/dev/ruby.nix index faf3193..f7419c3 100644 --- a/modules/dev/ruby.nix +++ b/modules/dev/ruby.nix @@ -16,9 +16,8 @@ in my.dev.ruby = { enable = lib.mkEnableOption "Install Ruby tooling globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install Ruby packages for"; }; }; diff --git a/modules/dev/rust.nix b/modules/dev/rust.nix index dc7dd4b..efdd975 100644 --- a/modules/dev/rust.nix +++ b/modules/dev/rust.nix @@ -21,9 +21,8 @@ in my.dev.rust = { enable = lib.mkEnableOption "Install Rust tooling globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install Rust packages for"; }; }; diff --git a/modules/dev/sh.nix b/modules/dev/sh.nix index 0705932..91a0343 100644 --- a/modules/dev/sh.nix +++ b/modules/dev/sh.nix @@ -20,9 +20,8 @@ in my.dev.sh = { enable = lib.mkEnableOption "Install shell scripting tools globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install shell scripting packages for"; }; }; diff --git a/modules/dev/zig.nix b/modules/dev/zig.nix index 9aec9df..0c6c557 100644 --- a/modules/dev/zig.nix +++ b/modules/dev/zig.nix @@ -18,9 +18,8 @@ in my.dev.zig = { enable = lib.mkEnableOption "Install Zig tooling globally"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.dev; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install Zig packages for"; }; }; diff --git a/modules/factories/mkscript.nix b/modules/factories/mkscript.nix index 5828b6f..566370e 100644 --- a/modules/factories/mkscript.nix +++ b/modules/factories/mkscript.nix @@ -14,9 +14,8 @@ install = lib.mkEnableOption "Whether to install the script package"; service = lib.mkEnableOption "Whether to enable the script service"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.scripts; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install this script for"; }; name = lib.mkOption { diff --git a/modules/services/printing.nix b/modules/services/printing.nix index e8f50aa..8d73cd2 100644 --- a/modules/services/printing.nix +++ b/modules/services/printing.nix @@ -15,9 +15,8 @@ in options.my.services.printing = { enable = lib.mkEnableOption "printing services and drivers"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.services; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install printing packages for"; }; }; diff --git a/modules/shell/config.nix b/modules/shell/config.nix index 5f72291..78bb74e 100644 --- a/modules/shell/config.nix +++ b/modules/shell/config.nix @@ -16,9 +16,8 @@ description = "The shell to use system-wide (bash or zsh)"; }; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.shell; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to configure shell for"; }; }; diff --git a/modules/shell/exercism.nix b/modules/shell/exercism.nix index f421d7d..3d63aa7 100644 --- a/modules/shell/exercism.nix +++ b/modules/shell/exercism.nix @@ -9,9 +9,8 @@ options.my.shell.exercism = { enable = lib.mkEnableOption "Exercism coding practice platform"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.shell; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install Exercism for"; }; }; diff --git a/modules/shell/multimedia.nix b/modules/shell/multimedia.nix index c74038f..7b2f665 100644 --- a/modules/shell/multimedia.nix +++ b/modules/shell/multimedia.nix @@ -9,9 +9,8 @@ options.my.shell.multimedia = { enable = lib.mkEnableOption "multimedia CLI tools and codecs"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.shell; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install multimedia shell tools for"; }; }; diff --git a/modules/shell/tools.nix b/modules/shell/tools.nix index 0cecdbc..eba4f84 100644 --- a/modules/shell/tools.nix +++ b/modules/shell/tools.nix @@ -12,9 +12,8 @@ in options.my.shell.tools = { enable = lib.mkEnableOption "shell tools and utilities"; users = lib.mkOption { - type = lib.types.either lib.types.str (lib.types.listOf lib.types.str); + type = inputs.self.lib.usersOptionType lib; default = config.my.toggleUsers.shell; - merge = inputs.self.lib.mergeUsersOption lib; description = "Users to install shell tools for"; }; }; diff --git a/parts/core.nix b/parts/core.nix index fed2a77..a2e971b 100644 --- a/parts/core.nix +++ b/parts/core.nix @@ -237,13 +237,20 @@ in }) (inputs.self.lib.normalizeUsers users) ); getFirstUser = users: if builtins.isString users then users else (builtins.head users); - mergeUsersOption = - lib: _loc: defs: - let - normalize = users: if builtins.isString users then [ users ] else users; - allUsers = lib.foldl' (acc: def: acc ++ (normalize def.value)) [ ] defs; - in - lib.unique allUsers; + usersOptionType = + lib: + lib.mkOptionType { + name = "usersOption"; + description = "Either a single user (string) or multiple users (list of strings)"; + check = x: builtins.isString x || (builtins.isList x && lib.all builtins.isString x); + merge = + _loc: defs: + let + normalize = users: if builtins.isString users then [ users ] else users; + allUsers = lib.foldl' (acc: def: acc ++ (normalize def.value)) [ ] defs; + in + lib.unique allUsers; + }; }; }; }