{ inputs, tree, systems, }: let nixlib = inputs.nixpkgs.lib; inherit (nixlib.modules) mkOrder mkOverride defaultOverridePriority; inherit (nixlib.strings) splitString toLower; inherit (nixlib.lists) imap0 elemAt findFirst foldl; inherit (nixlib.attrsets) mapAttrs listToAttrs nameValuePair; inherit (nixlib.strings) hasPrefix hasInfix removePrefix substring fixedWidthString replaceStrings concatMapStringsSep stringToCharacters match toInt; inherit (nixlib.trivial) flip toHexString bitOr; toHexStringLower = v: toLower (toHexString v); hexCharToInt = let hexChars = ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "a" "b" "c" "d" "e" "f"]; pairs = imap0 (flip nameValuePair) hexChars; idx = listToAttrs pairs; in char: idx.${char}; hexToInt = str: foldl (value: chr: value * 16 + hexCharToInt chr) 0 (stringToCharacters (toLower str)); eui64 = mac: let parts = map toLower (splitString ":" mac); part = elemAt parts; part0 = part: let nibble1' = hexCharToInt (substring 1 1 part); nibble1 = bitOr 2 nibble1'; nibble0 = substring 0 1 part; in nibble0 + (fixedWidthString 1 "0" (toHexStringLower nibble1)); in "${part0 (part 0)}${part 1}:${part 2}ff:fe${part 3}:${part 4}${part 5}"; parseUrl = url: let parts = match ''^([^:]+)://(\[[0-9a-fA-F:]+]|[^/:\[]+)(|:[0-9]+)(|/.*)$'' url; port' = elemAt parts 2; in assert parts != null; rec { inherit url parts; scheme = elemAt parts 0; host = elemAt parts 1; port = if port' != "" then toInt (removePrefix ":" port') else null; hostport = host + port'; path = elemAt parts 3; }; userIs = group: user: builtins.elem group (user.extraGroups ++ [user.group]); mkWinPath = replaceStrings ["/"] ["\\"]; mkBaseDn = domain: concatMapStringsSep "," (part: "dc=${part}") (splitString "." domain); mkAddress6 = addr: if hasInfix ":" addr && ! hasPrefix "[" addr then "[${addr}]" else addr; coalesce = findFirst (v: v != null) null; mapListToAttrs = f: l: listToAttrs (map f l); overrideOptionDefault = 1500; overrideAlmostOptionDefault = 1400; overrideDefault = 1000; overrideAlmostDefault = 900; overrideNone = defaultOverridePriority; # 100 overrideAlmostForce = 75; overrideForce = 50; overrideVM = 10; mkAlmostOptionDefault = mkOverride overrideAlmostOptionDefault; mkAlmostDefault = mkOverride overrideAlmostDefault; mkAlmostForce = mkOverride overrideAlmostForce; orderJustBefore = 400; orderBefore = 500; orderAlmostBefore = 600; orderNone = 1000; orderAlmostAfter = 1400; orderAfter = 1500; orderJustAfter = 1600; mkJustBefore = mkOrder orderJustBefore; mkAlmostBefore = mkOrder orderAlmostBefore; mkAlmostAfter = mkOrder orderAlmostAfter; mkJustAfter = mkOrder orderJustAfter; mapOverride = priority: mapAttrs (_: mkOverride priority); mapOptionDefaults = mapOverride overrideOptionDefault; mapAlmostOptionDefaults = mapOverride overrideAlmostOptionDefault; mapDefaults = mapOverride overrideDefault; treeToModulesOutput = modules: { ${ if modules ? __functor then "default" else null } = modules.__functor modules; } // builtins.removeAttrs modules ["__functor"]; in { inherit tree nixlib inputs systems; meta = tree.impure; std = inputs.self.lib.Std.Std.compat; Std = inputs.std-fl.lib; lib = { domain = "gensokyo.zone"; inherit treeToModulesOutput userIs eui64 parseUrl mkWinPath mkBaseDn mkAddress6 toHexStringLower hexToInt hexCharToInt mapListToAttrs coalesce mkAlmostOptionDefault mkAlmostDefault mkAlmostForce mapOverride mapOptionDefaults mapAlmostOptionDefaults mapDefaults overrideOptionDefault overrideAlmostOptionDefault overrideDefault overrideAlmostDefault overrideNone overrideAlmostForce overrideForce overrideVM orderJustBefore orderBefore orderAlmostBefore orderNone orderAfter orderAlmostAfter orderJustAfter mkJustBefore mkAlmostBefore mkAlmostAfter mkJustAfter; inherit (inputs.arcexprs.lib) unmerged json; }; gensokyo-zone = { inherit inputs; inherit (inputs) self; inherit (inputs.self) overlays; inherit (inputs.self.lib) tree meta lib systems; }; generate = import ./generate.nix {inherit inputs tree;}; }