{ 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; }; }; } ); 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; }; terminalPackageAttr = lib.mkOption { type = lib.types.str; }; nixosConfigurationPath = lib.mkOption { type = lib.types.str; default = "${config.homeDirectory}/.config/nixos"; }; emails = lib.mkOption { type = lib.types.attrsOf emailType; }; }; } ); 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 = { }; }; }; } ); 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; }; }; }; }