NAME
Types::XSD::Lite - type constraints based on a subset of XML schema datatypes
SYNOPSIS
package Person;
use Moo;
use Types::XSD::Lite qw( PositiveInteger String );
has name => (is => "ro", isa => String[ minLength => 1 ]);
has age => (is => "ro", isa => PositiveInteger);
DESCRIPTION
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.
Type Constraints
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 useBool
from Types::Standard instead. Base64Binary
-
Strings which are valid Base64 data. Allows whitespace.
Gotcha: If you parameterize this with
length
,maxLength
orminLength
, 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
orminLength
, 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 or relative 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]
allows10
,99
and-1
, but not100
,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
andBase64Binary
types, the lengths apply to the decoded string. Length restrictions are silently ignored forQName
andNotation
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
and1
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.
CAVEATS
This distribution has virtually no test suite, in the hope that Types::XSD's test suite will shake out any bugs in this module.
BUGS
Please report any bugs to http://rt.cpan.org/Dist/Display.html?Queue=Types-XSD-Lite.
SEE ALSO
Type::Tiny, Types::Standard, Types::XSD.
http://www.w3.org/TR/xmlschema-2/ Datatypes in XML Schema 1.0
http://www.w3.org/TR/xmlschema11-2/ Datatypes in XML Schema 1.1
AUTHOR
Toby Inkster <tobyink@cpan.org>.
COPYRIGHT AND LICENCE
This software is copyright (c) 2013-2014 by Toby Inkster.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
DISCLAIMER OF WARRANTIES
THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.