Parent types

These abstract data types are the parents of multiple other types, and match values that would match any of their sub-types. They’re useful when you have very loose restrictions but not no restrictions.

The Scalar data type

The Scalar data type matches all values of the following concrete data types:

  • Numbers (both integers and floats)

  • Strings

  • Booleans

  • Regular expressions

It doesn’t match undef, default, resource references, arrays, or hashes. It takes no parameters.

Scalar is equivalent to Variant[Integer, Float, String, Boolean, Regexp].

The ScalarData data type

The ScalarData data type represents a restricted set of "value" data types that have concrete direct representation in JSON.

ScalarData is an alias for Variant[Integer, Float, String, Boolean].

The Data data type

The Data data type matches any value that would match Scalar, but it also matches:

  • undef

  • Arrays that only contain values that also match Data

  • Hashes whose keys match Scalar and whose values also match Data

It doesn't match default or resource references. It takes no parameters.

Data is especially useful because it represents the subset of types that can be directly represented in almost all serialization format, such as JSON.

The Collection data type

The Collection type matches any array or hash, regardless of what kinds of values or keys it contains. It only partially overlaps with Data— there are values, such as an array of resource references, that match Collection but do not match Data.

Collection is equivalent to Variant[Array[Any], Hash[Any, Any]].

The CatalogEntry data type

The CatalogEntry data type is the parent type of Resource and Class. Like those types, the Puppet language contains no values that it ever matches. However, the type Type[CatalogEntry] matches any class reference or resource reference. It takes no parameters.

The Any data type

The Any data type matches any value of any data type.

The Iterable data type

The Iterable data type represents all data types that can be iterated; in other words, all data types where the value is some kind of container of individual values. The Iterable type is abstract in that it does not specify if it represents a concrete data type (such as Array) that has storage in memory, of if it is an algorithmic construct like a transformation function (such as the step function).

The Iterator data type

The Iterator data type is an Iterable that does not have a concrete backing data type holding a copy of the values it will produce when iterated over. It represents an algorithmic transformation of some source (which in turn can be algorithmic).

An Iterator may not be assigned to an attribute of a resource, and it may not be used as an argument to version 3.x functions. To create a concrete value an Iterator must be "rolled out" by using a function at the end of a chain that produces a concrete value.

The RichData data type

The RichData data type represents the abstract notion of "serializeable" and includes all the types in the type system except Runtime, Callable, Iterator, and Iterable. It is expressed as an alias of Variant[Default, Object, Scalar, SemVerRange, Type, Undef, Array[RichData], Hash[RichData, RichData]].