infrastructure/lib.nix
2024-05-02 11:04:45 -07:00

104 lines
3.6 KiB
Nix

{
inputs,
tree,
systems,
}: let
nixlib = inputs.nixpkgs.lib;
inherit (nixlib.modules) mkOrder mkOverride defaultOverridePriority;
inherit (nixlib.attrsets) mapAttrs listToAttrs;
inherit (inputs.self.lib.Std) List Str Regex UInt Opt;
eui64 = mac: let
parts = List.map Str.toLower (Regex.splitOn ":" mac);
part = List.index parts;
part0 = part: let
nibble1' = UInt.FromHexDigit (Str.index part 1);
nibble1 = UInt.or' 2 nibble1';
nibble0 = Str.index part 0;
in
nibble0 + UInt.toHexLower nibble1;
in "${part0 (part 0)}${part 1}:${part 2}ff:fe${part 3}:${part 4}${part 5}";
parseUrl = url: let
parts' = Regex.match ''^([^:]+)://(\[[0-9a-fA-F:]+]|[^/:\[]+)(|:[0-9]+)(|/.*)$'' url;
parts = parts'.value;
port' = List.index parts 2;
in assert Opt.isJust parts'; rec {
inherit url parts;
scheme = List.index parts 0;
host = List.index parts 1;
port = if port' != "" then UInt.Parse (Str.removePrefix ":" port') else null;
hostport = host + port';
path = List.index parts 3;
};
userIs = group: user: builtins.elem group (user.extraGroups ++ [user.group]);
mkWinPath = Str.replace ["/"] ["\\"];
mkBaseDn = domain: Str.concatMapSep "," (part: "dc=${part}") (Regex.splitOn "\\." domain);
mkAddress6 = addr: if Str.hasInfix ":" addr && ! Str.hasPrefix "[" addr then "[${addr}]" else addr;
coalesce = values: Opt.default null (List.find (v: v != null) values);
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
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 std Std;
};
generate = import ./generate.nix {inherit inputs tree;};
}