File Coverage

blib/lib/Data/Tubes/Plugin/Validator.pm
Criterion Covered Total %
statement 71 71 100.0
branch 24 26 92.3
condition 12 13 92.3
subroutine 15 15 100.0
pod 6 6 100.0
total 128 131 97.7


line stmt bran cond sub pod time code
1             package Data::Tubes::Plugin::Validator;
2 8     8   1516 use strict;
  8         18  
  8         233  
3 8     8   36 use warnings;
  8         13  
  8         224  
4 8     8   37 use English qw< -no_match_vars >;
  8         13  
  8         59  
5             our $VERSION = '0.740';
6              
7 8     8   2934 use Log::Log4perl::Tiny qw< :easy :dead_if_first >;
  8         14  
  8         68  
8              
9             use Data::Tubes::Util
10 8     8   2680 qw< args_array_with_options normalize_args shorter_sub_names >;
  8         14  
  8         456  
11 8     8   2829 use Data::Tubes::Plugin::Util qw< identify >;
  8         22  
  8         7187  
12             my %global_defaults = (input => 'structured',);
13              
14             sub validate_admit {
15 28     28 1 4271 my ($validators, $args) = args_array_with_options(
16             @_,
17             {
18             input => 'raw',
19             name => 'validate with acceptance regexp',
20             }
21             );
22 28         103 identify($args);
23 28         68 my $name = $args->{name};
24 28         64 my $input = $args->{input};
25 28         48 my $refuse = $args->{refuse};
26             return sub {
27 28     28   44 my $record = shift;
28 28 100       92 my $target = defined($input) ? $record->{$input} : $record;
29 28         61 for my $validator (@$validators) {
30 35 100       222 my $outcome =
31             (ref($validator) eq 'CODE')
32             ? $validator->($target)
33             : ($target =~ m{$validator});
34 35 100 100     249 return unless ($outcome xor $refuse);
35             } ## end for my $validator (@$validators)
36 14         98 return $record;
37 28         222 };
38             } ## end sub validate_admit
39              
40             sub validate_refuse {
41 20     20 1 3116 my ($validators, $args) = args_array_with_options(
42             @_,
43             {
44             input => 'raw',
45             name => 'validate with rejection regexp',
46             }
47             );
48 20         58 $args->{refuse} = 1;
49 20         52 return validate_admit(@$validators, $args);
50             } ## end sub validate_refuse
51              
52             sub validate_refuse_comment {
53 5     5 1 974 my $args = normalize_args(@_, {name => 'validate reject comment line'});
54 5         22 identify($args);
55 5         31 return validate_refuse(qr{(?mxs:\A \s* \#)}, $args);
56             }
57              
58             sub validate_refuse_comment_or_empty {
59 5     5 1 35 my $args = normalize_args(@_,
60             {name => 'validate reject comment or non-spaces-only line'});
61 5         22 identify($args);
62 5         29 return validate_refuse(qr{(?mxs:\A \s* (?: \# | \z ))}, $args);
63             } ## end sub validate_refuse_comment_or_empty
64              
65             sub validate_refuse_empty {
66 4     4 1 28 my $args = normalize_args(@_,
67             {name => 'validate reject empty (non-spaces only) string'});
68 4         21 identify($args);
69 4         22 return validate_refuse(qr{(?mxs:\A \s* \z)}, $args);
70             } ## end sub validate_refuse_empty
71              
72              
73             sub validate_thoroughly {
74 6     6 1 3988 my ($validators, $args) = args_array_with_options(
75             @_,
76             {
77             %global_defaults,
78             name => 'validate with subs',
79             output => 'validation',
80             keep_positives => 0,
81             keep_empty => 0,
82             wrapper => undef,
83             }
84             );
85 6         23 identify($args);
86 6         11 my $name = $args->{name};
87              
88 6         12 my $wrapper = $args->{wrapper};
89 6 100 66     25 if ($wrapper && $wrapper eq 'try') {
90 3 50       6 eval { require Try::Catch; }
  3         1178  
91             or LOGCONFESS 'Validator::validate_with_subs '
92             . 'needs Try::Catch, please install';
93              
94             $wrapper = sub {
95 18     18   30 my ($validator, @params) = @_;
96             return Try::Catch::try(
97 18         373 sub { $validator->(@params); },
98 18         61 Try::Catch::catch(sub { return (0, $_); }),
  5         68  
99             );
100 3         1994 };
101             } ## end if ($wrapper && $wrapper...)
102              
103 6         11 my $input = $args->{input};
104 6         12 my $output = $args->{output};
105 6         8 my $keep_positives = $args->{keep_positives};
106 6         9 my $keep_empty = $args->{keep_empty};
107             return sub {
108 13     13   8328 my $record = shift;
109 13 50       31 my $target = defined($input) ? $record->{$input} : $record;
110 13         16 my @outcomes;
111 13         35 for my $i (0 .. $#$validators) {
112             my ($name, $validator, @params) =
113             (ref($validators->[$i]) eq 'ARRAY')
114 39 100       100 ? @{$validators->[$i]}
  23         43  
115             : ("validator-$i", $validators->[$i]);
116 39 100       134 my @outcome =
    100          
    100          
117             $wrapper
118             ? $wrapper->($validator, $target, $record, $args, @params)
119             : (ref($validator) eq 'CODE')
120             ? $validator->($target, $record, $args, @params)
121             : (
122             $target =~ m{$validator}
123             ? (1)
124             : (0, regex => "$validator")
125             );
126 39 100       356 push @outcome, 0 unless @outcome;
127 39 100 100     148 push @outcomes, [$name, @outcome]
128             if !$outcome[0] || $keep_positives;
129             } ## end for my $i (0 .. $#$validators)
130 13         25 $record->{$output} = undef;
131 13 100 100     41 $record->{$output} = \@outcomes if @outcomes || $keep_empty;
132 13         48 return $record;
133 6         30 };
134             } ## end sub validate_with_subs
135              
136             *validate_with_subs = \&validate_thoroughly;
137              
138             shorter_sub_names(__PACKAGE__, 'validate_');
139              
140             1;