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
at cross 78 lines 1.9 kB view raw
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}