NAME

Salvation::TC::Utils - Дополнительные публичные функции Salvation::TC

SYNOPSIS

    use Salvation::TC::Utils;

    subtype 'CustomString',
        as 'Str',
        where { $_ eq 'asd' };

    subtype 'ArrayRefOfCustomStrings',
        as 'ArrayRef[CustomString]',
        where {};

    coerce 'ArrayRefOfCustomStrings',
        from 'CustomString',
        via { [ $_ ] };

    type 'CustomTopLevelType',
        where { ( ref( $_ ) eq 'HASH' ) && exists $_ -> { 'asd' } };

    enum 'RGB', [ 'red', 'green', 'blue' ];

    no Salvation::TC::Utils;

    Salvation::TC -> is( 'asd', 'CustomString' ); # true
    Salvation::TC -> is( 'qwe', 'CustomString' ); # false

    Salvation::TC -> is( 'green', 'RGB' ); # true
    Salvation::TC -> is( 'white', 'RGB' ); # false

    Salvation::TC -> coerce( 'asd', 'ArrayRefOfCustomStrings' ); # [ 'asd' ]
    Salvation::TC -> coerce( 'qwe', 'ArrayRefOfCustomStrings' ); # 'qwe'

    Salvation::TC -> ensure( 'asd', 'ArrayRefOfCustomStrings' ); # [ 'asd' ]
    Salvation::TC -> ensure( 'qwe', 'ArrayRefOfCustomStrings' ); # BOOM

    Salvation::TC -> assert( { asd => 123 }, 'CustomTopLevelType' ); # true
    Salvation::TC -> assert( { qwe => 123 }, 'CustomTopLevelType' ); # BOOM

SEE ALSO

Moose::Manual::Types

METHODS

coerce( Str $to, Salvation::TC::Meta::Type :$from!, CodeRef :$how! )

Объявляет новое правило приведения типа. Предполагаемое использование:

    coerce 'DestTypeName',
        from 'SourceTypeName',
        via { do_something_with( $_ ) };

Блок кода, переданный в via, будет содержать в $_ значение типа SourceTypeName, и должен вернуть значение типа DestTypeName.

Каждое правило приведения - глобальное, и доступно по всему коду сразу после определения правила.

При попытке привести значение к типу будет выбрано первое подходящее правило приведения. Например, если объявлено два правила:

    coerce 'Something',
        from 'Str',
        via { ... };

    coerce 'Something',
        from 'Int',
        via { ... };

, и происходит попытка привести к типу Something значение типа Int, то с указанными выше правилами будет выполнено приведение по правилу для типа Str, так как значение типа Int подходит и к типу Str. Если поменять правила местами, вот так:

    coerce 'Something',
        from 'Int',
        via { ... };

    coerce 'Something',
        from 'Str',
        via { ... };

, то поведение будет более ожидаемым: при попытке привести к типу Something значение типа Int будет выполнено приведение именно по правилу для типа Int: это правило встречается раньше, чем правило приведения для типа Str, и приводимое значение подходит под требуемый правилом тип.

Объявление правил приведения одних стандартных типов к другим стандартным типам напрямую крайне не рекомендуется. Best practice для подобных случаев:

    subtype 'MyCustomArrayOfStrings',
        as 'ArrayRef[Str]',
        where {}; # не проводить дополнительных проверок

    coerce 'MyCustomArrayOfStrings',
        from 'Str',
        via { [ $_ ] };

from( Str $type )

via( CodeRef $code )

type( Str $name, CodeRef :$validator! )

Объявляет новый тип верхнего уровня (без родительского типа). Предполагаемое использование:

    type 'NewTypeName',
        where { check_value_and_return_true_or_false( $_ ) };

Блок кода, переданный во where, будет содержать в $_ значение, которое необходимо проверить на соответствие объявляемому типу, и должен вернуть true если значение подходит по тип, или false, если значение не подходит.

Имея в распоряжении стандартные типы системы типов Moose (Moose::Manual::Types), вместо type всегда достаточно использовать subtype, что сохранит отношения между типами и не потребует дублирования кода самой проверки.

where( CodeRef $code )

subtype( Str $name, Salvation::TC::Meta::Type :$parent!, CodeRef :$validator! )

Объявляет новый тип, наследуемый от другого, уже существующего, типа. Предполагаемое использование:

    subtype 'ChildTypeName',
        as 'ParentTypeName',
        where { check_value_and_return_true_or_false( $_ ) };

Блок кода, переданный во where, будет содержать в $_ значение, которое необходимо проверить на соответствие объявляемому типу, и должен вернуть true если значение подходит по тип, или false, если значение не подходит.

Технически сначала будет выполнена проверка значения на соответствие родительскому типу, и только если эта проверка прошла успешно - будет выполнена проверка соответствия дочернему типу. Это гарантирует, что в $_ у where типа ChildTypeName всегда будет находиться значение типа ParentTypeName.

as( Str $type )

enum( Str $name, ArrayRef[Str] $values )

Хэлпер для создания enum'ов значений типа Str. Пример использования:

    enum 'RGB', [ 'red', 'green', 'blue' ];

1 POD Error

The following errors were encountered while parsing the POD:

Around line 5:

Non-ASCII character seen before =encoding in 'Дополнительные'. Assuming UTF-8