From 7679fed7ba88519783a18666d6ca7a8210605343 Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Mon, 6 Jan 2025 15:19:28 +0100 Subject: [PATCH] lib/types: use elemTypeFunctor for types.listOf --- lib/types.nix | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/types.nix b/lib/types.nix index 784016e57d9100..e74775d0a27ad5 100644 --- a/lib/types.nix +++ b/lib/types.nix @@ -71,6 +71,26 @@ let let pos = builtins.unsafeGetAttrPos name v; in if pos == null then "" else " at ${pos.file}:${toString pos.line}:${toString pos.column}"; + # Internal functor to help for migrating functor.wrapped to functor.payload.elemType + # Note that individual attributes can be overriden if needed. + elemTypeFunctor = name: { elemType, ... }@payload: { + inherit name payload; + type = outer_types.types.${name}; + binOp = a: b: + let + merged = a.elemType.typeMerge b.elemType.functor; + in + if merged == null + then + null + else + { elemType = merged; }; + wrappedDeprecationMessage = { loc }: lib.warn '' + The deprecated `type.functor.wrapped` attribute of the option `${showOption loc}` is accessed, use `type.nestedTypes.elemType` instead. + '' payload.elemType; + }; + + outer_types = rec { isType = type: x: (x._type or "") == type; @@ -580,7 +600,9 @@ rec { getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["*"]); getSubModules = elemType.getSubModules; substSubModules = m: listOf (elemType.substSubModules m); - functor = (defaultFunctor name) // { wrapped = elemType; }; + functor = (elemTypeFunctor name { inherit elemType; }) // { + type = payload: types.listOf payload.elemType; + }; nestedTypes.elemType = elemType; };