{ inputs, lib, ... }: let systemsDir = ../../../systems; systemNames = lib.attrNames (lib.filterAttrs (name: type: type == "directory" && builtins.pathExists (systemsDir + "/${name}/cfg.nix")) (builtins.readDir systemsDir)); userOpt = with lib; { username = mkOption { type = types.str; }; pubssh = mkOption { type = types.str; default=""; }; wm = mkOption { type = types.enum [ "Wayland" "X11" "-" ]; default = "-"; }; git = { username = mkOption { type = types.str; }; email = mkOption { type = types.str; }; key = mkOption { type = types.str; }; }; }; netOpt = with lib; { ble = { enable = mkOption { type = types.bool; default = false; }; }; wlp = { enable = mkOption { type = types.bool; default = false; }; nif = mkOption { type = types.str; default = ""; }; }; wg = { enable = mkOption { type = types.bool; default = false; }; ip4 = mkOption { type = types.str; default = ""; }; ip6 = mkOption { type = types.str; default = ""; }; pubkey = mkOption { type = types.str; default = ""; }; server = { enable = mkOption { type = types.bool; default = false; }; peers = mkOption { type = types.listOf types.str; default = []; }; forward = mkOption { type = types.listOf (types.listOf (types.oneOf [ types.str types.int ])); default = []; description = "Forwarding rules: [ [srcInterface dstAddr srcPort dstPort] ... ]"; example = [ [ "ens3" "10.10.1.2" "IPV6" 22 2222 ] [ "ens3" "10.10.1.2" "IPV6" 80 80 ] [ "ens3" "10.10.1.2" "IPV6" 443 443 ] ]; }; }; }; }; makeOpt = with lib; { cli = mkOption { type = types.bool; default = true; }; gui = mkOption { type = types.bool; default = false; }; virt = mkOption { type = types.bool; default = false; }; power = mkOption { type = types.bool; default = false; }; game = mkOption { type = types.bool; default = false; }; develop = mkOption { type = types.bool; default = false; }; }; serverOpt = with lib; { hostDomain = mkOption { type = types.str; }; shortName = mkOption { type = types.str; }; mailDomain = mkOption { type = types.str; }; mailServer = mkOption { type = types.str; }; dbHost = mkOption { type = types.str; default = "localhost"; }; dbPort = mkOption { type = types.str; default = "3306"; }; configPath = mkOption { type = types.str; default = "/media/config"; }; dataPath = mkOption { type = types.str; default = "/media/data"; }; }; in with lib; { options.usercfg = userOpt; options.syscfg = { hostname = mkOption { type = types.str; }; type = mkOption { type = types.enum [ "nixos" "macos" "home" ]; default = "nixos"; }; system = mkOption { type = types.enum [ "x86_64-linux" "x86_64-darwin" "-" ]; default = "x86_64-linux"; }; defaultUser = mkOption { type = types.str; }; make = makeOpt; net = netOpt; users = mkOption { type = types.listOf (types.submodule { options = userOpt; }); default = [ ]; }; peers = mkOption { default = map (name: import (systemsDir + "/${name}/cfg.nix")) systemNames; }; server = mkOption { type = types.oneOf [ (types.attrs) (types.submodule { options = serverOpt; }) ]; default = { }; }; }; }