old
 1{
 2  den,
 3  lib,
 4  ...
 5}: let
 6  # Shared collector body for the home-manager persistence quirks. Reused by
 7  # two distinct aspects so that the same logic runs at both the host scope
 8  # (projected onto users via the host-aspects battery) and the user scope.
 9  homeCollector = {
10    persistHome,
11    cacheHome,
12    config,
13    ...
14  }: let
15    _removeHomePrefix = path: lib.removePrefix "${config.home.homeDirectory}/" path;
16    removeHomePrefix = path:
17      if (lib.typeOf path == "string")
18      then _removeHomePrefix path
19      else path // {directory = _removeHomePrefix path.directory;};
20    removeHomePrefixes = paths: lib.map removeHomePrefix paths;
21    mergePersist = entries: {
22      directories = lib.unique (lib.concatMap (e: removeHomePrefixes (e.directories or [])) entries);
23      files = lib.unique (lib.concatMap (e: removeHomePrefixes (e.files or [])) entries);
24    };
25  in {
26    home.persistence.persist =
27      (mergePersist persistHome)
28      // {
29        persistentStoragePath = "/persist";
30      };
31    home.persistence.cache =
32      (mergePersist cacheHome)
33      // {
34        persistentStoragePath = "/cache";
35      };
36  };
37in {
38  den.quirks.persist.description = "Persistent directories/files collected from aspects (host)";
39  den.quirks.cache.description = "Cache directories/files collected from aspects (host)";
40  den.quirks.persistUser.description = "Persistent directories/files collected from aspects (user)";
41  den.quirks.cacheUser.description = "Cache directories/files collected from aspects (user)";
42  den.quirks.persistHome.description = "Persistent directories/files collected from aspects (home manager)";
43  den.quirks.cacheHome.description = "Cache directories/files collected from aspects (home manager)";
44
45  den.aspects.core.impermanence.persist-collector = {
46    nixos = {
47      persist,
48      cache,
49      ...
50    }: let
51      mergePersist = entries: {
52        directories = lib.unique (lib.concatMap (e: e.directories or []) entries);
53        files = lib.unique (lib.concatMap (e: e.files or []) entries);
54      };
55    in {
56      environment.persistence.persist = mergePersist persist;
57      environment.persistence.cache = mergePersist cache;
58    };
59  };
60
61  den.aspects.core.impermanence.persist-user-collector = {
62    user = {
63      user,
64      persistUser,
65      cacheUser,
66      config,
67      ...
68    }: let
69      _removeHomePrefix = path: lib.removePrefix "${config.users.users.${user.userName}.home}/" path;
70      removeHomePrefix = path:
71        if (lib.typeOf path == "string")
72        then _removeHomePrefix path
73        else path // {directory = _removeHomePrefix path.directory;};
74      removeHomePrefixes = paths: lib.map removeHomePrefix paths;
75      mergePersist = entries: {
76        directories = lib.unique (lib.concatMap (e: removeHomePrefixes (e.directories or [])) entries);
77        files = lib.unique (lib.concatMap (e: removeHomePrefixes (e.files or [])) entries);
78      };
79    in {
80      persistence.persist = mergePersist persistUser;
81      persistence.cache = mergePersist cacheUser;
82    };
83  };
84
85  den.aspects.core.impermanence.persist-home-collector.homeManager = homeCollector;
86  den.aspects.core.impermanence.persist-home-user-collector.homeManager = homeCollector;
87
88  den.default.includes = (
89    den.lib.policy.when
90    ({host, ...}:
91      host.hasAspect {
92        name = "impermanence";
93        meta.provider = ["core"];
94      })
95    [den.aspects.core.impermanence.persist-home-user-collector]
96  );
97}