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 main 40 lines 848 B view raw
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}