{ lib, ... }: let mkNullableOption = type: lib.mkOption { inherit type; default = null; }; emailType = lib.types.submodule ( { ... }: { options = { address = lib.mkOption { type = lib.types.str; }; primary = lib.mkOption { type = lib.types.bool; }; type = lib.mkOption { type = lib.types.str; }; }; } ); sourceControlHostKeyType = lib.types.submodule ( { ... }: { options = { publicKey = lib.mkOption { type = lib.types.str; }; privateKeyPath = lib.mkOption { type = lib.types.nullOr lib.types.str; default = null; }; }; } ); sourceControlHostUserType = lib.types.submodule ( { ... }: { options = { personal = mkNullableOption sourceControlHostKeyType; work = mkNullableOption sourceControlHostKeyType; }; } ); hostSourceControlType = lib.types.submodule ( { ... }: { options.users = lib.mkOption { type = lib.types.attrsOf sourceControlHostUserType; default = { }; }; } ); sourceControlProfileType = lib.types.submodule ( { ... }: { options = { }; } ); sourceControlType = lib.types.submodule ( { ... }: { options = { profiles = lib.mkOption { type = lib.types.attrsOf sourceControlProfileType; default = { }; }; projectScope = lib.mkOption { type = lib.types.enum [ "personal" "work" ]; default = "personal"; }; }; } ); userType = lib.types.submodule ( { config, ... }: { options = { name = lib.mkOption { type = lib.types.str; }; realName = lib.mkOption { type = lib.types.str; }; homeDirectory = lib.mkOption { type = lib.types.str; }; terminalPackagePath = lib.mkOption { type = lib.types.listOf lib.types.str; }; nixosConfigurationPath = lib.mkOption { type = lib.types.str; default = "${config.homeDirectory}/.config/nixos"; }; emails = lib.mkOption { type = lib.types.attrsOf emailType; }; sourceControl = lib.mkOption { type = sourceControlType; default = { }; }; }; } ); displayModeType = lib.types.submodule ( { ... }: { options = { width = lib.mkOption { type = lib.types.int; }; height = lib.mkOption { type = lib.types.int; }; refresh = lib.mkOption { type = lib.types.float; }; }; } ); displayType = lib.types.submodule ( { ... }: { options = { primary = lib.mkOption { type = lib.types.bool; default = false; }; x = lib.mkOption { type = lib.types.int; }; y = lib.mkOption { type = lib.types.int; }; scale = lib.mkOption { type = lib.types.nullOr lib.types.float; default = null; }; mode = lib.mkOption { type = lib.types.nullOr displayModeType; default = null; }; }; } ); mouseInputType = lib.types.submodule ( { ... }: { options = { accelProfile = mkNullableOption ( lib.types.nullOr ( lib.types.enum [ "adaptive" "flat" ] ) ); accelSpeed = mkNullableOption (lib.types.nullOr lib.types.float); leftHanded = mkNullableOption (lib.types.nullOr lib.types.bool); middleEmulation = mkNullableOption (lib.types.nullOr lib.types.bool); naturalScrolling = mkNullableOption (lib.types.nullOr lib.types.bool); scrollMethod = mkNullableOption ( lib.types.nullOr ( lib.types.enum [ "no-scroll" "two-finger" "edge" "on-button-down" ] ) ); }; } ); touchpadInputType = lib.types.submodule ( { ... }: { options = { accelProfile = mkNullableOption ( lib.types.nullOr ( lib.types.enum [ "adaptive" "flat" ] ) ); accelSpeed = mkNullableOption (lib.types.nullOr lib.types.float); clickMethod = mkNullableOption ( lib.types.nullOr ( lib.types.enum [ "button-areas" "clickfinger" ] ) ); disableWhileTyping = mkNullableOption (lib.types.nullOr lib.types.bool); leftHanded = mkNullableOption (lib.types.nullOr lib.types.bool); middleEmulation = mkNullableOption (lib.types.nullOr lib.types.bool); naturalScrolling = mkNullableOption (lib.types.nullOr lib.types.bool); scrollMethod = mkNullableOption ( lib.types.nullOr ( lib.types.enum [ "no-scroll" "two-finger" "edge" "on-button-down" ] ) ); tapping = mkNullableOption (lib.types.nullOr lib.types.bool); }; } ); inputType = lib.types.submodule ( { ... }: { options = { mouse = lib.mkOption { type = mouseInputType; default = { }; }; touchpad = lib.mkOption { type = touchpadInputType; default = { }; }; }; } ); hostType = lib.types.submodule ( { ... }: { options = { name = lib.mkOption { type = lib.types.str; }; displays = lib.mkOption { type = lib.types.attrsOf displayType; default = { }; }; input = lib.mkOption { type = inputType; default = { }; }; users = lib.mkOption { type = lib.types.attrsOf userType; default = { }; }; sourceControl = lib.mkOption { type = hostSourceControlType; default = { }; }; }; } ); in { flake.modules.nixos.meta = { options.meta.host = lib.mkOption { type = hostType; }; }; flake.modules.homeManager.meta = { options.meta = { host = lib.mkOption { type = lib.types.nullOr hostType; default = null; }; user = lib.mkOption { type = lib.types.nullOr userType; default = null; }; }; }; }