These are all the type constraints from XML Schema that could be implemented without introducing extra
runtime dependencies (above Type::Tiny). That's basically all of the XSD types, except datetime-related
ones, and XML-specific ones (QNames, IDRefs, etc).
If you want the full set of XML Schema types, see Types::XSD.
TypeConstraints
I've added some quick explanations of what each type is, but for details, see the XML Schema
specification.
"AnyType"
As per "Any" from Types::Standard.
"AnySimpleType"
As per "Value" from Types::Standard.
"String"
As per "Str" from Types::Standard.
"NormalizedString"
A string containing no line breaks, carriage returns or tabs.
"Token"
Like "NormalizedString", but also no leading or trailing space, and no doubled spaces (i.e. not
"/\s{2,}/").
"Language"
An RFC 3066 language code.
"Boolean"
Allows "true", "false", "1" and "0" (case-insensitively).
Gotcha: The string "false" evaluates to true in Perl. You probably want to use "Bool" from
Types::Standard instead.
"Base64Binary"
Strings which are valid Base64 data. Allows whitespace.
Gotcha: If you parameterize this with "length", "maxLength" or "minLength", it is the length of the
decoded string which will be checked.
"HexBinary"
Strings which are valid hexadecimal data. Disallows whitespace; disallows leading "0x".
Gotcha: If you parameterize this with "length", "maxLength" or "minLength", it is the length of the
decoded string which will be checked.
"Float"
As per "Num" from Types::Standard.
"Double"
As per "Num" from Types::Standard.
"AnyURI"
Any absolute orrelative URI. Effectively, any string at all!
"Decimal"
Numbers possibly including a decimal point, but not allowing exponential notation (e.g. "3.14e-3").
"Integer"
As per "Int" from Types::Standard.
"NonPositiveInteger"
An "Integer" 0 or below.
"NegativeInteger"
An "Integer" -1 or below.
"Long"
An "Integer" between -9223372036854775808 and 9223372036854775807 (inclusive).
"Int"
An "Integer" between -2147483648 and 2147483647 (inclusive).
"Short"
An "Integer" between -32768 and 32767 (inclusive).
"Byte"
An "Integer" between -128 and 127 (inclusive).
"NonNegativeInteger"
An "Integer" 0 or above.
"PositiveInteger"
An "Integer" 1 or above.
"UnsignedLong"
A "NonNegativeInteger" between 0 and 18446744073709551615 (inclusive).
"UnsignedInt"
A "NonNegativeInteger" between 0 and 4294967295 (inclusive).
"UnsignedShort"
A "NonNegativeInteger" between 0 and 65535 (inclusive).
"UnsignedByte"
A "NonNegativeInteger" between 0 and 255 (inclusive).
Parameters
Datatypes can be parameterized using the facets defined by XML Schema. For example:
use Types::XSD::Lite qw( String Decimal PositiveInteger Token );
my @sizes = qw( XS S M L XL XXL );
has name => (is => "ro", isa => String[ minLength => 1 ]);
has price => (is => "ro", isa => Decimal[ fractionDigits => 2 ]);
has rating => (is => "ro", isa => PositiveInteger[ maxInclusive => 5 ]);
has size => (is => "ro", isa => Token[ enumeration => \@sizes ]);
The following facets exist, but not all facets are supported for all datatypes. (The module will croak if
you try to use an unsupported facet.)
"enumeration"
An arrayref of allowable values. You should probably use Type::Tiny::Enum instead.
"pattern"
A regular expression that the value is expected to conform to. Use a normal Perl quoted regexp:
Token[ pattern => qr{^[a-z]+$} ]
"whiteSpace"
The "whiteSpace" facet is ignored as I'm not entirely sure what it should do. It perhaps makes sense
for coercions, but this module doesn't define any coercions.
"assertions"
An arrayref of arbitrary additional restrictions, expressed as strings of Perl code or coderefs
operating on $_.
For example:
Integer[
assertions => [
'$_ % 3 == 0', # multiple of three, and...
sub { is_nice($_) }, # is nice (whatever that means)
],
],
Strings of Perl code will result in faster-running type constraints.
"length", "maxLength", "minLength"
Restrict the length of a value. For example "Integer[length=>2]" allows 10, 99 and "-1", but not 100,
9 or "-10".
Types::XSD::Lite won't prevent you from making ridiculous constraints such as "String[ maxLength =>
1, minLength => 2 ]".
Note that on "HexBinary" and "Base64Binary" types, the lengths apply to the decoded string. Length
restrictions are silently ignored for "QName" and "Notation" because the W3C doesn't think you should
care what length these datatypes are.
"maxInclusive", "minInclusive", "maxExclusive", "minExclusive"
Supported for numeric types and datetime/duration-related types.
Note that to be super-correct, the "{max,min}{Inclusive,Exclusive}" facets for numeric types are
performed by passing the numbers through Math::BigInt or Math::BigFloat, so may be a little slow.
"totalDigits"
For a decimal (or type derived from decimals) specifies that the total number of digits for the value
must be at most this number. Given "Decimal[ totalDigits => 3 ]", 1.23, 12.3, 123, 1.2 and 1 are all
allowable; 1.234 is not. 1.230 is also not, but this may change in a future version.
"fractionDigits"
Like "totalDigits" but ignores digits before the decimal point.