From 0580ad02bd617cb39534d53d1c5d5944ae66b843 Mon Sep 17 00:00:00 2001 From: Qyriad Date: Tue, 3 Feb 2026 18:37:16 +0100 Subject: [PATCH] refactor assertions --- default.nix | 5 ++++ modules/dynamicism/default.nix | 41 ++++++++++++++++++-------------- modules/dynamicism/submodule.nix | 2 +- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/default.nix b/default.nix index 023fac8..56cc148 100644 --- a/default.nix +++ b/default.nix @@ -45,10 +45,15 @@ in dynix.overrideAttrs (final: prev: let self = final.finalPackage; in lib.recursiveUpdate prev { passthru = { + dync = self.nixos.config.dynamicism; + dyno = self.nixos.options.dynamicism; + gotosocial = self.nixos.options.dynamicism.for.valueMeta.attrs.gotosocial.configuration; + inherit byStdenv; nixos = evalNixos { configuration = ./configuration.nix; }; + c = self.nixos; nixos-vm = self.nixos.config.system.build.vm; doChange = builtins.seq self.nixos.config.dynamicism doChange; }; diff --git a/modules/dynamicism/default.nix b/modules/dynamicism/default.nix index 0e769b5..1b243ac 100644 --- a/modules/dynamicism/default.nix +++ b/modules/dynamicism/default.nix @@ -11,20 +11,8 @@ let ; t = lib.types; cfg = config.dynamicism; - - settingsFormat = pkgs.formats.yaml { }; - - assertionFor = submodName: unitName: let - optName = [ "dynamicism" "for" submodName "systemd-services-updated" ]; - in { - assertion = config.systemd.units.${unitName}.enable or false; - message = "'${showOption optName}' specified non-existentant unit '${unitName}'"; - }; - - assertionsFor = - submodName: - submod: - lib.map (assertionFor submodName) submod.systemd-services-updated; + opts = options.dynamicism; + subOpts = lib.mapAttrs (_: metaAttr: metaAttr.configuration.options) options.dynamicism.for.valueMeta.attrs; finalSettingsFor = { ... }@submod: lib.foldl (acc: optPath: let next = @@ -52,14 +40,31 @@ in }; }; - config.assertions = lib.foldlAttrs (acc: name: submod: let - next = lib.optionals submod.enable (assertionsFor name submod); - in acc ++ next) [ ] cfg.for; + config.assertions = let + unitsExist = lib.foldl' (acc: submod: let + next = lib.map (unit: assert lib.isString unit; { + assertion = config.systemd.units.${unit}.enable or false; + message = '' + '${showOption submod.systemd-services-updated.loc}' specified non-existent unit '${unit}' + ''; + }) submod.systemd-services-updated.value; + in acc ++ lib.optionals submod.enable.value next) [ ] (lib.attrValues subOpts); + + optsExist = lib.foldl' (acc: submod: let + next = lib.map (optPath: { + assertion = lib.hasAttrByPath optPath options; + message = "'${showOption submod.source-options.loc}' specified non-existent option '${showOption optPath}'"; + }) submod.source-options.value; + in acc ++ lib.optionals submod.enable.value next) [ ] (lib.attrValues subOpts); + in lib.concatLists [ + unitsExist + optsExist + ]; config.dynamicism.for = { gotosocial = { source-options = [ - "services.gotosocial.settings" + "services.gotosocial.setting" ]; systemd-services-updated = [ "gotosocial.service" diff --git a/modules/dynamicism/submodule.nix b/modules/dynamicism/submodule.nix index 65039ae..8f6ff1e 100644 --- a/modules/dynamicism/submodule.nix +++ b/modules/dynamicism/submodule.nix @@ -20,7 +20,7 @@ let in { options = { - enable = mkEnableOption "Enable dynamicism for '${name}'"; + enable = mkEnableOption "dynamicism for '${name}'"; source-options = mkOption { type = t.listOf convenientAttrPath;