The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

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 CP1252