1
0
mirror of http://code.capytal.cc/dot013/spacestation.git synced 2026-01-16 07:56:11 -03:00
Files
spacestation/modules/forgejo/customization.nix

151 lines
4.2 KiB
Nix

{
config,
inputs,
lib,
pkgs,
...
}: let
cfg = config.services.forgejo.customization;
forgejo = config.services.forgejo;
fileType = with lib.types; either str (either lines path);
in {
imports = [
inputs.home-manager.nixosModules.default
];
options.services.forgejo.customization = with lib;
with lib.types; {
enable = mkOption {
type = bool;
default = true;
};
assets = mkOption {
type = nullOr path;
default = null;
};
options = {
label = mkOption {
type = attrsOf (attrsOf (submodule ({
config,
lib,
...
}:
with lib;
with lib.types; {
options = {
name = mkOption {
type = nullOr str;
default = null;
};
exclusive = mkOption {
type = bool;
default = false;
};
color = mkOption {
type = str;
};
description = mkOption {
type = str;
default = "";
};
priority = mkOption {
type = nullOr (enum ["low" "medium" "high" "critical"]);
default = null;
};
};
})));
default = {};
};
};
templates = mkOption {
type = nullOr path;
default = null;
};
theme = mkOption {
type = nullOr (either (attrsOf fileType) fileType);
default = null;
};
};
config = with lib;
mkIf cfg.enable {
home-manager.users."${forgejo.user}" = let
home = {
lib,
forgejoConfig,
customization,
...
}:
with lib;
with builtins; {
imports = [];
programs.home-manager.enable = true;
home.username = "${forgejoConfig.user}";
home.homeDirectory = "${forgejoConfig.stateDir}";
home.file = let
fileTypeToHomeFile = theme:
if (isString theme)
then {
text = theme;
}
else {source = theme;};
assetsDir = "${forgejoConfig.customDir}/public/assets";
templatesDir = "${forgejoConfig.customDir}/templates";
optionsDir = "${forgejoConfig.customDir}/options";
in
{
"${assetsDir}" = mkIf (!(isNull cfg.assets)) {
source = cfg.assets;
recursive = true;
};
"${templatesDir}" = mkIf (!(isNull cfg.templates)) {
source = cfg.templates;
recursive = true;
};
}
// (lib.attrsets.mapAttrs'
(ln: lv:
lib.attrsets.nameValuePair "${optionsDir}/label/${ln}.yaml" {
text = toJSON {
labels = attrValues (mapAttrs
(n: v: {
name =
if isNull v.name
then n
else v.name;
exclusive = v.exclusive;
color = v.color;
description = v.description;
priority = v.priority;
})
lv);
};
})
customization.options.label)
// (
if (!(isNull customization.theme))
then
if isAttrs customization.theme
then
(lib.attrsets.mapAttrs'
(n: v:
lib.attrsets.nameValuePair "${assetsDir}/css/theme-${n}.css" (fileTypeToHomeFile v))
customization.theme)
else {
"${assetsDir}/css/theme-custom.css" = fileTypeToHomeFile customization.theme;
}
else {}
);
home.stateVersion = "23.11"; # DO NOT CHANGE
};
in
home {
inherit lib;
forgejoConfig = forgejo;
customization = cfg;
};
};
}