File Coverage

blib/lib/Salvation/TC/Type/ArrayRef.pm
Criterion Covered Total %
statement 45 46 97.8
branch 11 14 78.5
condition 8 11 72.7
subroutine 12 12 100.0
pod 1 3 33.3
total 77 86 89.5


line stmt bran cond sub pod time code
1             package Salvation::TC::Type::ArrayRef;
2              
3 4     4   1356 use strict;
  4         7  
  4         116  
4 4     4   15 use warnings;
  4         6  
  4         101  
5              
6 4     4   17 use base 'Salvation::TC::Type::Ref';
  4         5  
  4         1305  
7              
8 4     4   17 use Scalar::Util 'blessed';
  4         4  
  4         173  
9 4     4   13 use Salvation::TC::Exception::WrongType ();
  4         4  
  4         36  
10 4     4   13 use Salvation::TC::Exception::WrongType::TC ();
  4         5  
  4         1258  
11              
12              
13             sub Check {
14              
15 56     56 1 60 my ( $class, $value ) = @_;
16              
17 56 100       262 ( ref( $value ) eq 'ARRAY' ) || Salvation::TC::Exception::WrongType -> throw( 'type' => 'ArrayRef', 'value' => $value );
18             }
19              
20             sub create_validator_from_sig {
21              
22 5     5 0 8 my ( $class, $signature ) = @_;
23              
24 5         6 my @checks = ();
25 5         7 my $i = 0;
26              
27 5         7 foreach my $el ( @$signature ) {
28              
29 6         11 my ( $param, $type ) = @$el{ 'param', 'type' };
30              
31 6 50       10 die( 'Only positional parameters are supported' ) if( $param -> { 'named' } );
32              
33 6 50       12 die( 'Optional parameters are not supported' ) if( $param -> { 'optional' } );
34              
35 6         7 my $local_i = $i++;
36              
37             push( @checks, sub {
38              
39 13     13   18 my ( @input ) = @_;
40              
41 13         9 eval { $type -> check( $input[ 0 ] -> [ $local_i ] ) };
  13         35  
42              
43 13 100       29 if( $@ ) {
44              
45 4 50 33     26 if( blessed( $@ ) && $@ -> isa( 'Salvation::TC::Exception::WrongType' ) ) {
46              
47 4 100       12 Salvation::TC::Exception::WrongType::TC -> throw(
48             type => $@ -> getType(),
49             value => $@ -> getValue(),
50             param_name => $local_i,
51             ( $@ -> isa( 'Salvation::TC::Exception::WrongType::TC' ) ? (
52             prev => $@ -> getPrev(),
53             ) : () ),
54             );
55              
56             } else {
57              
58 0         0 die( $@ );
59             }
60             };
61 6         27 } );
62             }
63              
64             return sub {
65              
66 11     11   25 $_ -> ( $_[ 0 ] ) for @checks;
67              
68 7         18 1;
69 5         16 };
70             }
71              
72             sub create_length_validator {
73              
74 10     10 0 12 my ( $class, $min, $max ) = @_;
75              
76             return sub {
77              
78 17     17   11 my $len = scalar( @{ $_[ 0 ] } );
  17         22  
79              
80 17 100 100     92 if( ( $len < $min ) || ( defined $max && ( $len > $max ) ) ) {
      66        
81              
82 4   100     31 Salvation::TC::Exception::WrongType -> throw(
83             'type' => sprintf( 'ArrayRef{%s,%s}', $min, ( $max // '' ) ),
84             'value' => $_[ 0 ]
85             );
86             }
87              
88 13         21 1;
89 10         38 };
90             }
91              
92             1;
93              
94             __END__