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 inputs,
3 lib,
4 deep,
5 ...
6}:
7let
8 deepModule.nixos.options.deepVals = lib.mkOption {
9 type = lib.types.listOf lib.types.str;
10 };
11 depthA = {
12 denful.deep.a._.b._.c._.d._.e = {
13 description = "5 levels deep from inputA";
14 nixos.deepVals = [ "inputA-5-levels" ];
15 provides.f.nixos.deepVals = [ "inputA-6-levels" ];
16 };
17 };
18 depthB = {
19 denful.deep.a._.b._.c._.d._.e = {
20 nixos.deepVals = [ "inputB-5-levels" ];
21 provides.f.nixos.deepVals = [ "inputB-6-levels" ];
22 };
23 };
24in
25{
26 imports = [
27 (inputs.den.namespace "deep" [
28 true
29 depthA
30 depthB
31 ])
32 ];
33
34 deep.a._.b._.c._.d._.e = {
35 nixos.deepVals = [ "local-5-levels" ];
36 provides.f.nixos.deepVals = [ "local-6-levels" ];
37 };
38
39 den.aspects.rockhopper.includes = [
40 deepModule
41 deep.a._.b._.c._.d._.e
42 deep.a._.b._.c._.d._.e._.f
43 ];
44
45 perSystem =
46 { checkCond, rockhopper, ... }:
47 let
48 vals = lib.sort (a: b: a < b) rockhopper.config.deepVals;
49 in
50 {
51 checks.deep-nest-5-levels = checkCond "5 levels deep merged correctly" (
52 builtins.elem "inputA-5-levels" vals
53 && builtins.elem "inputB-5-levels" vals
54 && builtins.elem "local-5-levels" vals
55 );
56
57 checks.deep-nest-6-levels = checkCond "6 levels deep merged correctly" (
58 builtins.elem "inputA-6-levels" vals
59 && builtins.elem "inputB-6-levels" vals
60 && builtins.elem "local-6-levels" vals
61 );
62
63 checks.deep-nest-all-merged = checkCond "all values merged" (
64 vals == [
65 "inputA-5-levels"
66 "inputA-6-levels"
67 "inputB-5-levels"
68 "inputB-6-levels"
69 "local-5-levels"
70 "local-6-levels"
71 ]
72 );
73
74 checks.deep-nest-flake-output = checkCond "deep namespace as flake output" (
75 inputs.self.denful.deep.a._.b._.c._.d._.e._.f == deep.a._.b._.c._.d._.e._.f
76 );
77 };
78}