@ -147,9 +147,13 @@ rec {
, # The deprecation message to display when this type is used by an option
# If null, the type isn't deprecated
deprecationMessage ? null
, # The types that occur in the definition of this type. This is used to
# issue deprecation warnings recursively. Can also be used to reuse
# nested types
nestedTypes ? { }
} :
{ _type = " o p t i o n - t y p e " ;
inherit name check merge emptyValue getSubOptions getSubModules substSubModules typeMerge functor deprecationMessage ;
inherit name check merge emptyValue getSubOptions getSubModules substSubModules typeMerge functor deprecationMessage nestedTypes ;
description = if description == null then name else description ;
} ;
@ -365,6 +369,7 @@ rec {
getSubModules = elemType . getSubModules ;
substSubModules = m : listOf ( elemType . substSubModules m ) ;
functor = ( defaultFunctor name ) // { wrapped = elemType ; } ;
nestedTypes . elemType = elemType ;
} ;
nonEmptyListOf = elemType :
@ -389,6 +394,7 @@ rec {
getSubModules = elemType . getSubModules ;
substSubModules = m : attrsOf ( elemType . substSubModules m ) ;
functor = ( defaultFunctor name ) // { wrapped = elemType ; } ;
nestedTypes . elemType = elemType ;
} ;
# A version of attrsOf that's lazy in its values at the expense of
@ -413,6 +419,7 @@ rec {
getSubModules = elemType . getSubModules ;
substSubModules = m : lazyAttrsOf ( elemType . substSubModules m ) ;
functor = ( defaultFunctor name ) // { wrapped = elemType ; } ;
nestedTypes . elemType = elemType ;
} ;
# TODO: drop this in the future:
@ -421,6 +428,7 @@ rec {
deprecationMessage = " M i x i n g l i s t s w i t h a t t r i b u t e v a l u e s i s n o l o n g e r "
+ " p o s s i b l e ; p l e a s e u s e ` t y p e s . a t t r s O f ` i n s t e a d . S e e "
+ " h t t p s : / / g i t h u b . c o m / N i x O S / n i x p k g s / i s s u e s / 1 8 0 0 f o r t h e m o t i v a t i o n . " ;
nestedTypes . elemType = elemType ;
} ;
# Value of given type but with no merging (i.e. `uniq list`s are not concatenated).
@ -433,6 +441,7 @@ rec {
getSubModules = elemType . getSubModules ;
substSubModules = m : uniq ( elemType . substSubModules m ) ;
functor = ( defaultFunctor name ) // { wrapped = elemType ; } ;
nestedTypes . elemType = elemType ;
} ;
# Null or value of ...
@ -451,6 +460,7 @@ rec {
getSubModules = elemType . getSubModules ;
substSubModules = m : nullOr ( elemType . substSubModules m ) ;
functor = ( defaultFunctor name ) // { wrapped = elemType ; } ;
nestedTypes . elemType = elemType ;
} ;
functionTo = elemType : mkOptionType {
@ -535,6 +545,9 @@ rec {
substSubModules = m : submoduleWith ( attrs // {
modules = m ;
} ) ;
nestedTypes = lib . optionalAttrs ( freeformType != null ) {
freeformType = freeformType ;
} ;
functor = defaultFunctor name // {
type = types . submoduleWith ;
payload = {
@ -596,6 +609,8 @@ rec {
then functor . type mt1 mt2
else null ;
functor = ( defaultFunctor name ) // { wrapped = [ t1 t2 ] ; } ;
nestedTypes . left = t1 ;
nestedTypes . right = t2 ;
} ;
# Any of the types in the given list
@ -627,6 +642,8 @@ rec {
substSubModules = m : coercedTo coercedType coerceFunc ( finalType . substSubModules m ) ;
typeMerge = t1 : t2 : null ;
functor = ( defaultFunctor name ) // { wrapped = finalType ; } ;
nestedTypes . coercedType = coercedType ;
nestedTypes . finalType = finalType ;
} ;
# Obsolete alternative to configOf. It takes its option