Commit f0bd696

HPCesia <me@hpcesia.com>
2026-07-30 09:55:41
Refactor impermanence user persist
1 parent fe4db7a
Changed files (2)
modules
core
modules/core/impermanence/default.nix
@@ -38,16 +38,64 @@
       ];
     };
 
-    nixos = {lib, ...}: {
+    nixos = {
+      pkgs,
+      lib,
+      config,
+      ...
+    }: {
       imports = [inputs.impermanence.nixosModules.impermanence];
 
-      environment.persistence."/persist" = {
-        enable = true;
-        hideMounts = lib.mkDefault true;
+      options = {
+        users.users = lib.mkOption {
+          type = lib.types.attrsOf (lib.types.submodule ({name, ...}: {
+            options = {
+              persistence = let
+                userName = name;
+                outConfig = config;
+              in
+                lib.mkOption {
+                  type = lib.types.attrsOf (lib.types.submodule ({
+                    name,
+                    config,
+                    ...
+                  }:
+                    lib.modules.importApply "${inputs.impermanence}/submodule-options.nix" {
+                      inherit pkgs lib name;
+                      config = outConfig.environment.persistence.${name} // config;
+                      usersOpts = true;
+                      user = userName;
+                      group = outConfig.users.users.${userName}.group;
+                      homeDir = outConfig.users.users.${userName}.home;
+                    }));
+                  default = {};
+                };
+            };
+          }));
+        };
       };
-      environment.persistence."/cache" = {
-        enable = true;
-        hideMounts = lib.mkDefault true;
+
+      config = let
+        filterRemovedOptions = attrs:
+          (removeAttrs attrs ["home"])
+          // {directories = map (dir: removeAttrs dir ["method"]) attrs.directories;};
+      in {
+        environment.persistence.persist = {
+          enable = true;
+          persistentStoragePath = "/persist";
+          hideMounts = lib.mkDefault true;
+          users =
+            lib.mapAttrs (_: u: filterRemovedOptions (u.persistence.persist or {}))
+            (lib.filterAttrs (_: u: u.persistence ? persist) config.users.users);
+        };
+        environment.persistence.cache = {
+          enable = true;
+          persistentStoragePath = "/cache";
+          hideMounts = lib.mkDefault true;
+          users =
+            lib.mapAttrs (_: u: filterRemovedOptions (u.persistence.cache or {}))
+            (lib.filterAttrs (_: u: u.persistence ? cache) config.users.users);
+        };
       };
     };
   };
modules/core/impermanence/quirks.nix
@@ -23,8 +23,16 @@
       files = lib.unique (lib.concatMap (e: removeHomePrefixes (e.files or [])) entries);
     };
   in {
-    home.persistence."/persist" = mergePersist persistHome;
-    home.persistence."/cache" = mergePersist cacheHome;
+    home.persistence.persist =
+      (mergePersist persistHome)
+      // {
+        persistentStoragePath = "/persist";
+      };
+    home.persistence.cache =
+      (mergePersist cacheHome)
+      // {
+        persistentStoragePath = "/cache";
+      };
   };
 in {
   den.quirks.persist.description = "Persistent directories/files collected from aspects (host)";
@@ -45,13 +53,13 @@ in {
         files = lib.unique (lib.concatMap (e: e.files or []) entries);
       };
     in {
-      environment.persistence."/persist" = mergePersist persist;
-      environment.persistence."/cache" = mergePersist cache;
+      environment.persistence.persist = mergePersist persist;
+      environment.persistence.cache = mergePersist cache;
     };
   };
 
-  den.aspects.core.impermanence.persist-user-collector = {user, ...}: {
-    nixos = {
+  den.aspects.core.impermanence.persist-user-collector = {
+    user = {
       persistUser,
       cacheUser,
       ...
@@ -61,8 +69,8 @@ in {
         files = lib.unique (lib.concatMap (e: e.files or []) entries);
       };
     in {
-      environment.persistence."/persist".users.${user.userName} = mergePersist persistUser;
-      environment.persistence."/cache".users.${user.userName} = mergePersist cacheUser;
+      persistence.persist = mergePersist persistUser;
+      persistence.cache = mergePersist cacheUser;
     };
   };