refactor: simplify host composition and shared feature config
This commit is contained in:
+100
-28
@@ -4,6 +4,22 @@
|
||||
...
|
||||
}:
|
||||
let
|
||||
mkHostUser =
|
||||
{
|
||||
account,
|
||||
needsPassword ? false,
|
||||
homeImports ? [ ],
|
||||
stateVersion ? null,
|
||||
}:
|
||||
{
|
||||
inherit
|
||||
account
|
||||
homeImports
|
||||
needsPassword
|
||||
stateVersion
|
||||
;
|
||||
};
|
||||
|
||||
mkHost =
|
||||
{
|
||||
name,
|
||||
@@ -20,22 +36,15 @@ let
|
||||
...
|
||||
}:
|
||||
let
|
||||
hostUsers = lib.mapAttrs (_: spec: spec.account) users;
|
||||
hostUserSpecs = lib.mapAttrs (_: spec: mkHostUser spec) users;
|
||||
hostUsers = lib.mapAttrs (_: spec: spec.account) hostUserSpecs;
|
||||
|
||||
userAssertions = lib.flatten (
|
||||
lib.mapAttrsToList (userName: spec: [
|
||||
{
|
||||
assertion = userName == spec.account.name;
|
||||
message = "Host `${name}` declares user `${userName}` with mismatched account name `${spec.account.name}`.";
|
||||
}
|
||||
{
|
||||
assertion = builtins.isList spec.homeImports;
|
||||
message = "Host `${name}` user `${userName}` must define `homeImports` as a list.";
|
||||
}
|
||||
]) users
|
||||
);
|
||||
userAssertions = lib.mapAttrsToList (userName: spec: {
|
||||
assertion = userName == spec.account.name;
|
||||
message = "Host `${name}` declares user `${userName}` with mismatched account name `${spec.account.name}`.";
|
||||
}) hostUserSpecs;
|
||||
|
||||
passwordUserSpecs = lib.filterAttrs (_: spec: spec.needsPassword or false) users;
|
||||
passwordUserSpecs = lib.filterAttrs (_: spec: spec.needsPassword) hostUserSpecs;
|
||||
in
|
||||
{
|
||||
assertions = userAssertions;
|
||||
@@ -76,23 +85,26 @@ let
|
||||
"networkmanager"
|
||||
];
|
||||
}
|
||||
// lib.optionalAttrs (spec.needsPassword or false) {
|
||||
// lib.optionalAttrs spec.needsPassword {
|
||||
hashedPasswordFile = config.sops.secrets."hashed-password-${userName}".path;
|
||||
}
|
||||
) users;
|
||||
) hostUserSpecs;
|
||||
|
||||
home-manager.users = lib.mapAttrs (_: spec: {
|
||||
imports = spec.homeImports;
|
||||
meta = {
|
||||
host = config.meta.host;
|
||||
user = spec.account;
|
||||
};
|
||||
home = {
|
||||
username = spec.account.name;
|
||||
homeDirectory = spec.account.homeDirectory;
|
||||
stateVersion = spec.stateVersion or stateVersion;
|
||||
};
|
||||
}) users;
|
||||
home-manager.users = lib.mapAttrs (
|
||||
_: spec:
|
||||
{
|
||||
imports = spec.homeImports;
|
||||
meta = {
|
||||
host = config.meta.host;
|
||||
user = spec.account;
|
||||
};
|
||||
home = {
|
||||
username = spec.account.name;
|
||||
homeDirectory = spec.account.homeDirectory;
|
||||
stateVersion = if spec.stateVersion == null then stateVersion else spec.stateVersion;
|
||||
};
|
||||
}
|
||||
) hostUserSpecs;
|
||||
};
|
||||
|
||||
mkCaddyReverseProxy =
|
||||
@@ -170,6 +182,8 @@ let
|
||||
};
|
||||
|
||||
kanagawa = {
|
||||
displayName = "Kanagawa Wave";
|
||||
name = "kanagawa-wave";
|
||||
gtkThemeName = "Kanagawa-BL-LB";
|
||||
iconThemeName = "Kanagawa";
|
||||
owner = "Fausto-Korpsvart";
|
||||
@@ -177,6 +191,56 @@ let
|
||||
rev = "55ca4ba249eba21f861b9866b71ab41bb8930318";
|
||||
hash = "sha256-UdMoMx2DoovcxSp/zBZ3PRv/Qpj+prd0uPm1gmdak2E=";
|
||||
version = "unstable-2025-10-23";
|
||||
|
||||
palette = {
|
||||
background = "#1F1F28";
|
||||
foreground = "#DCD7BA";
|
||||
secondaryBackground = "#16161D";
|
||||
border = "#2A2A37";
|
||||
selectionBackground = "#2D4F67";
|
||||
selectionForeground = "#C8C093";
|
||||
url = "#72A7BC";
|
||||
cursor = "#C8C093";
|
||||
muted = "#727169";
|
||||
|
||||
accents = {
|
||||
blue = "#7E9CD8";
|
||||
green = "#98BB6C";
|
||||
magenta = "#D27E99";
|
||||
orange = "#FFA066";
|
||||
purple = "#957FB8";
|
||||
red = "#E82424";
|
||||
yellow = "#E6C384";
|
||||
cyan = "#7AA89F";
|
||||
};
|
||||
|
||||
niri.border = {
|
||||
active = "#7E9CD8";
|
||||
inactive = "#54546D";
|
||||
urgent = "#E82424";
|
||||
};
|
||||
|
||||
terminal = {
|
||||
color0 = "#16161D";
|
||||
color1 = "#C34043";
|
||||
color2 = "#76946A";
|
||||
color3 = "#C0A36E";
|
||||
color4 = "#7E9CD8";
|
||||
color5 = "#957FB8";
|
||||
color6 = "#6A9589";
|
||||
color7 = "#C8C093";
|
||||
color8 = "#727169";
|
||||
color9 = "#E82424";
|
||||
color10 = "#98BB6C";
|
||||
color11 = "#E6C384";
|
||||
color12 = "#7FB4CA";
|
||||
color13 = "#938AA9";
|
||||
color14 = "#7AA89F";
|
||||
color15 = "#DCD7BA";
|
||||
color16 = "#FFA066";
|
||||
color17 = "#FF5D62";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -392,6 +456,13 @@ in
|
||||
readOnly = true;
|
||||
};
|
||||
|
||||
options.meta.lib.mkHostUser = lib.mkOption {
|
||||
type = lib.types.raw;
|
||||
description = "Internal host user constructor shared between flake-parts modules.";
|
||||
internal = true;
|
||||
readOnly = true;
|
||||
};
|
||||
|
||||
options.meta.lib.mkCaddyReverseProxy = lib.mkOption {
|
||||
type = lib.types.raw;
|
||||
description = "Internal Caddy reverse proxy helper shared between flake-parts modules.";
|
||||
@@ -447,6 +518,7 @@ in
|
||||
mkCaddyReverseProxy
|
||||
mkTerminalAssertions
|
||||
mkHost
|
||||
mkHostUser
|
||||
repo
|
||||
resolvePackagePath
|
||||
resolveUserTerminal
|
||||
|
||||
Reference in New Issue
Block a user