{ lib, machineDir, ... }: let allMachineNames = lib.mapAttrsToList (name: _: name) (builtins.readDir machineDir); getFactPath = fact: machine: "${machineDir}/${machine}/facts/${fact}"; readFact = fact: machine: let path = getFactPath fact machine; in if builtins.pathExists path then builtins.readFile path else null; # machine -> factvalue readFactFromAllMachines = fact: let machines = allMachineNames; facts = lib.genAttrs machines (readFact fact); filteredFacts = lib.filterAttrs (_machine: fact: fact != null) facts; in filteredFacts; # returns an Attrs of machines and it's facts which have all given facts set. # machine -> fact -> value readFactsFromAllMachines = facts: let # machine -> fact -> factvalue machinesFactsAttrs = lib.genAttrs allMachineNames (machine: lib.genAttrs facts (fact: readFact fact machine)); # remove all machines which don't have all facts set filteredMachineFactAttrs = lib.filterAttrs (_machine: values: builtins.all (fact: values.${fact} != null) facts) machinesFactsAttrs; in filteredMachineFactAttrs; in { inherit allMachineNames getFactPath readFact readFactFromAllMachines readFactsFromAllMachines; }