File Coverage

blib/lib/Data/Sah/Filter/perl/Str/check.pm
Criterion Covered Total %
statement 11 34 32.3
branch 0 20 0.0
condition 0 2 0.0
subroutine 4 6 66.6
pod 0 2 0.0
total 15 64 23.4


line stmt bran cond sub pod time code
1             package Data::Sah::Filter::perl::Str::check;
2              
3 1     1   474735 use 5.010001;
  1         4  
4 1     1   5 use strict;
  1         2  
  1         31  
5 1     1   5 use warnings;
  1         1  
  1         66  
6              
7 1     1   801 use Data::Dmp;
  1         2473  
  1         651  
8              
9             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
10             our $DATE = '2024-07-17'; # DATE
11             our $DIST = 'Data-Sah-Filter'; # DIST
12             our $VERSION = '0.025'; # VERSION
13              
14             sub meta {
15             +{
16 0     0 0   v => 1,
17             summary => 'Perform some checks',
18             might_fail => 1,
19             args => {
20             min_len => {
21             schema => 'uint*',
22             },
23             max_len => {
24             schema => 'uint*',
25             },
26             match => {
27             schema => 're*',
28             },
29             in => {
30             schema => ['array*', of=>'str*'],
31             },
32             },
33             examples => [
34             {value=>"12", filter_args=>{min_len=>3}, valid=>0},
35             {value=>"12345", filter_args=>{min_len=>3}, valid=>1},
36              
37             {value=>"123", filter_args=>{max_len=>3}, valid=>1},
38             {value=>"12345", filter_args=>{max_len=>3}, valid=>0},
39              
40             {value=>"123", filter_args=>{match=>'[abc]'}, valid=>0},
41             {value=>"a", filter_args=>{match=>'[abc]'}, valid=>1},
42              
43             ],
44             description => <<'_',
45              
46             This is more or less a demo filter rule, to show how a filter rule can be used
47             to perform some checks. The standard checks performed by this rule, however, are
48             better done using standard schema clauses like `in`, `min_len`, etc.
49              
50             _
51             };
52             }
53              
54             sub filter {
55 0     0 0   my %fargs = @_;
56              
57 0           my $dt = $fargs{data_term};
58 0   0       my $gen_args = $fargs{args} // {};
59              
60 0           my @check_exprs;
61 0 0         if (defined $gen_args->{min_len}) {
62 0           my $val = $gen_args->{min_len} + 0;
63 0 0         push @check_exprs, (@check_exprs ? "elsif" : "if") . qq( (length(\$tmp) < $val) { ["Length of data must be at least $val", \$tmp] } );
64             }
65 0 0         if (defined $gen_args->{max_len}) {
66 0           my $val = $gen_args->{max_len} + 0;
67 0 0         push @check_exprs, (@check_exprs ? "elsif" : "if") . qq( (length(\$tmp) > $val) { ["Length of data must be at most $val", \$tmp] } );
68             }
69 0 0         if (defined $gen_args->{match}) {
70 0 0         my $val = ref $gen_args->{match} eq 'Regexp' ? $gen_args->{match} : qr/$gen_args->{match}/;
71 0 0         push @check_exprs, (@check_exprs ? "elsif" : "if") . qq| (\$tmp !~ |.dmp($val).qq|) { ["Data must match $val", \$tmp] } |;
72             }
73 0 0         if (defined $gen_args->{in}) {
74 0           my $val = $gen_args->{in};
75 0 0         push @check_exprs, (@check_exprs ? "elsif" : "if") . qq| (!grep { \$_ eq \$tmp } \@{ |.dmp($val).qq| }) { ["Data must be one of ".join(", ", \@{|.dmp($val).qq|}), \$tmp] } |;
76             }
77 0 0         unless (@check_exprs) {
78 0           push @check_exprs, qq(if (0) { } );
79             }
80 0           my $res = {};
81             $res->{expr_filter} = join(
82             "",
83             "do {\n",
84             " my \$tmp = $dt;\n",
85 0           (map { " $_\n" } @check_exprs),
  0            
86             " else { [undef, \$tmp] }\n",
87             "}",
88             );
89              
90 0           $res;
91             }
92              
93             1;
94             # ABSTRACT: Perform some checks
95              
96             __END__