{ pkgs ? import {} , ... }@args: hostName: let loadSls = import ./load-sls.nix args; pillarBase = (loadSls ../../../salt-pillar/top.sls).base; globToRegex = builtins.replaceStrings ["*"] [".*"]; baseMatches = if hostName == "*" then builtins.attrNames pillarBase else builtins.filter (patterns: pkgs.lib.any (pattern: builtins.match (globToRegex pattern) hostName != null ) ( builtins.filter builtins.isString ( builtins.split " or " patterns ) ) ) (builtins.attrNames pillarBase); fileIds = builtins.foldl' (result: matchName: result ++ pillarBase.${matchName} ) [] baseMatches; allFilePaths = pkgs.lib.filesystem.listFilesRecursive ../../../salt-pillar; files = map (fileId: let parts = builtins.filter builtins.isString ( builtins.split "\\." fileId ); matches = builtins.filter (filePath: let suffix1 = builtins.concatStringsSep "/" (parts ++ [ "init.sls" ]); suffix2 = (builtins.concatStringsSep "/" parts) + ".sls"; check = suffix: endsWith suffix (builtins.toString filePath); in check suffix1 || check suffix2 ) allFilePaths; matchesLength = builtins.length matches; in if matchesLength == 0 then throw "No pillar file for ${fileId}" else if matchesLength > 1 then throw "Ambiguous choice of files for ${fileId}" else builtins.head matches ) fileIds; endsWith = suffix: s: let suffixLen = builtins.stringLength suffix; sLen = builtins.stringLength s; in builtins.substring (sLen - suffixLen) suffixLen s == suffix; in loadSls files