···11{ lib, ... }:
22let
33- # Helper to read age keys (public keys only)
33+ # Helper to read age keys with different types
44 readAgeKeys =
55 baseDir:
66 let
77 dir = baseDir + "/age";
88 in
99 if builtins.pathExists dir then
1010- lib.mapAttrs' (
1111- name: _:
1212- let
1313- # Remove everything after the first dot
1414- keyName = builtins.head (lib.splitString "." name);
1515- in
1616- lib.nameValuePair keyName (builtins.readFile (dir + "/${name}"))
1717- ) (builtins.readDir dir)
1010+ let
1111+ allFiles = builtins.readDir dir;
1212+ # Group files by base name and type
1313+ processFile =
1414+ name: type:
1515+ if type == "regular" then
1616+ let
1717+ parts = lib.splitString "." name;
1818+ baseName = builtins.head parts;
1919+ extension = if builtins.length parts > 1 then lib.last parts else "";
2020+ in
2121+ {
2222+ name = baseName;
2323+ value =
2424+ if extension == "age" then
2525+ {
2626+ public = builtins.readFile (dir + "/${name}");
2727+ identity = null;
2828+ }
2929+ else if extension == "identity" then
3030+ {
3131+ public = null;
3232+ identity = builtins.readFile (dir + "/${name}");
3333+ }
3434+ else
3535+ null;
3636+ }
3737+ else
3838+ null;
3939+4040+ # Process all files and merge by base name
4141+ fileAttrs = lib.filterAttrs (_n: v: v != null) (lib.mapAttrs processFile allFiles);
4242+4343+ # Merge entries with same base name
4444+ mergeEntries = lib.foldl' (
4545+ acc: entry:
4646+ let
4747+ existing =
4848+ acc.${entry.name} or {
4949+ public = null;
5050+ identity = null;
5151+ };
5252+ merged = {
5353+ public = if entry.value.public != null then entry.value.public else existing.public;
5454+ identity = if entry.value.identity != null then entry.value.identity else existing.identity;
5555+ };
5656+ in
5757+ acc // { ${entry.name} = merged; }
5858+ ) { } (lib.attrValues fileAttrs);
5959+ in
6060+ mergeEntries
1861 else
1962 { };
2063