Modular, context-aware and aspect-oriented dendritic Nix configurations.
Discussions: https://oeiuwq.zulipchat.com/join/nqp26cd4kngon6mo3ncgnuap/
den.oeiuwq.com
configurations
den
dendritic
nix
aspect
oriented
1{
2 lib,
3 den,
4 ...
5}:
6let
7 inherit (den.lib) parametric;
8
9 mkAspect = aspect: classes: { ${aspect} = parametric (lib.genAttrs classes (_: { })); };
10
11 toClasses = from: [
12 {
13 aspect = from.aspect;
14 classes = from.classes or [ from.class ];
15 }
16 ];
17
18 hosts = map builtins.attrValues (builtins.attrValues den.hosts);
19 homes = map builtins.attrValues (builtins.attrValues den.homes);
20
21 groupByAspect =
22 pairs:
23 lib.foldl' (
24 acc: { aspect, classes }: acc // { ${aspect} = (acc.${aspect} or [ ]) ++ classes; }
25 ) { } pairs;
26
27 deps = lib.pipe hosts [
28 (lib.flatten)
29 (map (h: builtins.attrValues h.users))
30 (users: users ++ hosts ++ homes)
31 (lib.flatten)
32 (lib.concatMap toClasses)
33 (lib.unique)
34 (groupByAspect)
35 (lib.mapAttrsToList mkAspect)
36 ];
37in
38{
39 den.aspects = lib.mkMerge deps;
40}