From 8de3bc1b72061ae7f89c4416d99eaa5d31965467 Mon Sep 17 00:00:00 2001 From: Jelle Spreeuwenberg Date: Tue, 21 Apr 2026 22:48:00 +0200 Subject: [PATCH] refactor: use terminal package attr paths with shared resolver --- modules/features/meta.nix | 4 ++-- modules/features/niri/default.nix | 24 ++++++++++++++---------- modules/features/noctalia.nix | 27 +++++++++++---------------- modules/features/terminal.nix | 21 +++++++++++---------- modules/hosts/orion/default.nix | 15 ++++++--------- modules/lib.nix | 15 +++++++++++++++ modules/users.nix | 4 ++-- 7 files changed, 61 insertions(+), 49 deletions(-) diff --git a/modules/features/meta.nix b/modules/features/meta.nix index 5debee7..c6d7228 100644 --- a/modules/features/meta.nix +++ b/modules/features/meta.nix @@ -42,8 +42,8 @@ let type = lib.types.str; }; - terminalPackageAttr = lib.mkOption { - type = lib.types.str; + terminalPackagePath = lib.mkOption { + type = lib.types.listOf lib.types.str; }; nixosConfigurationPath = lib.mkOption { diff --git a/modules/features/niri/default.nix b/modules/features/niri/default.nix index 2f2f222..1cdcf9c 100644 --- a/modules/features/niri/default.nix +++ b/modules/features/niri/default.nix @@ -1,4 +1,11 @@ -{ inputs, ... }: +{ + inputs, + config, + ... +}: +let + metaLib = config.meta.lib; +in { flake.modules.nixos.niri = { pkgs, ... }: @@ -43,13 +50,10 @@ inherit (display) mode; } ) config.meta.host.displays; - rawTerminalAttrPath = lib.splitString "." config.meta.user.terminalPackageAttr; - terminalAttrPath = - if rawTerminalAttrPath != [ ] && builtins.head rawTerminalAttrPath == "pkgs" then - builtins.tail rawTerminalAttrPath - else - rawTerminalAttrPath; - terminalPackage = lib.attrByPath terminalAttrPath null pkgs; + terminalPackage = metaLib.resolvePackagePath { + inherit pkgs; + path = config.meta.user.terminalPackagePath; + }; hasMainProgram = terminalPackage != null && terminalPackage ? meta.mainProgram; mouseSettings = lib.filterAttrs (_: value: value != null) { @@ -77,11 +81,11 @@ assertions = [ { assertion = terminalPackage != null; - message = "Unknown terminal package `${config.meta.user.terminalPackageAttr}` for user `${config.meta.user.name}`."; + message = "Unknown terminal package `${lib.showAttrPath config.meta.user.terminalPackagePath}` for user `${config.meta.user.name}`."; } { assertion = hasMainProgram; - message = "Terminal package `${config.meta.user.terminalPackageAttr}` must define `meta.mainProgram`."; + message = "Terminal package `${lib.showAttrPath config.meta.user.terminalPackagePath}` must define `meta.mainProgram`."; } ]; diff --git a/modules/features/noctalia.nix b/modules/features/noctalia.nix index 44f0e1b..6d53f08 100644 --- a/modules/features/noctalia.nix +++ b/modules/features/noctalia.nix @@ -5,6 +5,7 @@ }: let homeModules = config.flake.modules.homeManager; + metaLib = config.meta.lib; mkPortableSettings = baseSettings: lib.recursiveUpdate baseSettings { @@ -37,13 +38,10 @@ in ... }: let - rawTerminalAttrPath = lib.splitString "." config.meta.user.terminalPackageAttr; - terminalAttrPath = - if rawTerminalAttrPath != [ ] && builtins.head rawTerminalAttrPath == "pkgs" then - builtins.tail rawTerminalAttrPath - else - rawTerminalAttrPath; - terminalPackage = lib.attrByPath terminalAttrPath null pkgs; + terminalPackage = metaLib.resolvePackagePath { + inherit pkgs; + path = config.meta.user.terminalPackagePath; + }; hasMainProgram = terminalPackage != null && terminalPackage ? meta.mainProgram; baseSettings = if hasMainProgram then @@ -62,11 +60,11 @@ in assertions = [ { assertion = terminalPackage != null; - message = "Unknown terminal package `${config.meta.user.terminalPackageAttr}` for user `${config.meta.user.name}`."; + message = "Unknown terminal package `${lib.showAttrPath config.meta.user.terminalPackagePath}` for user `${config.meta.user.name}`."; } { assertion = hasMainProgram; - message = "Terminal package `${config.meta.user.terminalPackageAttr}` must define `meta.mainProgram`."; + message = "Terminal package `${lib.showAttrPath config.meta.user.terminalPackagePath}` must define `meta.mainProgram`."; } ]; @@ -90,13 +88,10 @@ in ... }: let - rawTerminalAttrPath = lib.splitString "." config.meta.user.terminalPackageAttr; - terminalAttrPath = - if rawTerminalAttrPath != [ ] && builtins.head rawTerminalAttrPath == "pkgs" then - builtins.tail rawTerminalAttrPath - else - rawTerminalAttrPath; - terminalPackage = lib.attrByPath terminalAttrPath null pkgs; + terminalPackage = metaLib.resolvePackagePath { + inherit pkgs; + path = config.meta.user.terminalPackagePath; + }; hasMainProgram = terminalPackage != null && terminalPackage ? meta.mainProgram; baseSettings = if hasMainProgram then diff --git a/modules/features/terminal.nix b/modules/features/terminal.nix index 1f9286b..62b90a4 100644 --- a/modules/features/terminal.nix +++ b/modules/features/terminal.nix @@ -1,3 +1,7 @@ +{ config, ... }: +let + metaLib = config.meta.lib; +in { flake.modules.homeManager.terminal = { @@ -7,13 +11,10 @@ ... }: let - rawTerminalAttrPath = lib.splitString "." config.meta.user.terminalPackageAttr; - terminalAttrPath = - if rawTerminalAttrPath != [ ] && builtins.head rawTerminalAttrPath == "pkgs" then - builtins.tail rawTerminalAttrPath - else - rawTerminalAttrPath; - terminalPackage = lib.attrByPath terminalAttrPath null pkgs; + terminalPackage = metaLib.resolvePackagePath { + inherit pkgs; + path = config.meta.user.terminalPackagePath; + }; hasTerminalPackage = terminalPackage != null; hasMainProgram = hasTerminalPackage && terminalPackage ? meta.mainProgram; terminalDesktopId = @@ -23,15 +24,15 @@ assertions = [ { assertion = hasTerminalPackage; - message = "Unknown terminal package `${config.meta.user.terminalPackageAttr}` for user `${config.meta.user.name}`."; + message = "Unknown terminal package `${lib.showAttrPath config.meta.user.terminalPackagePath}` for user `${config.meta.user.name}`."; } { assertion = hasMainProgram; - message = "Terminal package `${config.meta.user.terminalPackageAttr}` must define `meta.mainProgram`."; + message = "Terminal package `${lib.showAttrPath config.meta.user.terminalPackagePath}` must define `meta.mainProgram`."; } { assertion = hasMainProgram && builtins.pathExists "${terminalPackage}/share/applications/${terminalDesktopId}"; - message = "Terminal package `${config.meta.user.terminalPackageAttr}` must provide `${terminalDesktopId}`."; + message = "Terminal package `${lib.showAttrPath config.meta.user.terminalPackagePath}` must provide `${terminalDesktopId}`."; } { assertion = hasMainProgram && terminalPackage.meta.mainProgram == "kitty"; diff --git a/modules/hosts/orion/default.nix b/modules/hosts/orion/default.nix index adc97f8..92fea6e 100644 --- a/modules/hosts/orion/default.nix +++ b/modules/hosts/orion/default.nix @@ -17,23 +17,20 @@ in ... }: let - rawTerminalAttrPath = lib.splitString "." config.meta.host.users.kiri.terminalPackageAttr; - terminalAttrPath = - if rawTerminalAttrPath != [ ] && builtins.head rawTerminalAttrPath == "pkgs" then - builtins.tail rawTerminalAttrPath - else - rawTerminalAttrPath; - terminalPackage = lib.attrByPath terminalAttrPath null pkgs; + terminalPackage = metaLib.resolvePackagePath { + inherit pkgs; + path = config.meta.host.users.kiri.terminalPackagePath; + }; in { assertions = [ { assertion = terminalPackage != null; - message = "Unknown terminal package `${config.meta.host.users.kiri.terminalPackageAttr}` for user `kiri`."; + message = "Unknown terminal package `${lib.showAttrPath config.meta.host.users.kiri.terminalPackagePath}` for user `kiri`."; } { assertion = terminalPackage != null && lib.elem "terminfo" terminalPackage.outputs; - message = "Terminal package `${config.meta.host.users.kiri.terminalPackageAttr}` must provide a `terminfo` output for `orion`."; + message = "Terminal package `${lib.showAttrPath config.meta.host.users.kiri.terminalPackagePath}` must provide a `terminfo` output for `orion`."; } ]; diff --git a/modules/lib.nix b/modules/lib.nix index c5488b3..21fbb33 100644 --- a/modules/lib.nix +++ b/modules/lib.nix @@ -56,6 +56,13 @@ let ''; }; + resolvePackagePath = + { + pkgs, + path, + }: + lib.attrByPath path null pkgs; + mkHostUser = { account, @@ -136,6 +143,13 @@ in readOnly = true; }; + options.meta.lib.resolvePackagePath = lib.mkOption { + type = lib.types.raw; + description = "Internal helper to resolve package attr paths against the local pkgs set."; + internal = true; + readOnly = true; + }; + options.meta.lib.users = lib.mkOption { type = lib.types.attrs; description = "Canonical user attrsets shared by host definitions."; @@ -148,6 +162,7 @@ in mkCaddyReverseProxy mkHost mkHostUser + resolvePackagePath ; }; } diff --git a/modules/users.nix b/modules/users.nix index 60f6029..0f2c495 100644 --- a/modules/users.nix +++ b/modules/users.nix @@ -4,7 +4,7 @@ let name = "kiri"; realName = "Jelle Spreeuwenberg"; homeDirectory = "/home/kiri"; - terminalPackageAttr = "kitty"; + terminalPackagePath = [ "kitty" ]; emails = { main = { address = "mail@jelles.net"; @@ -33,7 +33,7 @@ let name = "ergon"; realName = "Jelle Spreeuwenberg"; homeDirectory = "/home/ergon"; - terminalPackageAttr = "kitty"; + terminalPackagePath = [ "kitty" ]; emails = { work = { address = "jelle.spreeuwenberg@yookr.org";