File Coverage

blib/lib/Data/Sah/DefaultValue.pm
Criterion Covered Total %
statement 38 44 86.3
branch 6 14 42.8
condition n/a
subroutine 8 8 100.0
pod 1 1 100.0
total 53 67 79.1


line stmt bran cond sub pod time code
1             package Data::Sah::DefaultValue;
2              
3 1     1   83062 use 5.010001;
  1         18  
4 1     1   7 use strict;
  1         3  
  1         25  
5 1     1   6 use warnings;
  1         2  
  1         34  
6 1     1   5 no warnings 'once';
  1         2  
  1         39  
7 1     1   1886 use Log::ger;
  1         59  
  1         5  
8              
9 1     1   731 use Data::Sah::DefaultValueCommon;
  1         3  
  1         42  
10              
11 1     1   8 use Exporter qw(import);
  1         2  
  1         564  
12              
13             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
14             our $DATE = '2021-11-28'; # DATE
15             our $DIST = 'Data-Sah-DefaultValue'; # DIST
16             our $VERSION = '0.001'; # VERSION
17              
18             our @EXPORT_OK = qw(gen_default_value_code);
19              
20             our %SPEC;
21              
22             our $Log_Default_Value_Code = $ENV{LOG_SAH_DEFAULT_VALUE_CODE} // 0;
23              
24             $SPEC{gen_default_value_code} = {
25             v => 1.1,
26             summary => 'Generate code to set default value',
27             description => <<'_',
28              
29             This is mostly for testing. Normally the default value rules will be used from
30             .
31              
32             _
33             args => {
34             %Data::Sah::DefaultValueCommon::gen_default_value_code_args,
35             },
36             result_naked => 1,
37             };
38             sub gen_default_value_code {
39 1     1 1 1448 my %args = @_;
40              
41 1         7 my $rules = Data::Sah::DefaultValueCommon::get_default_value_rules(
42             %args,
43             compiler=>'perl',
44             );
45              
46 1         4 my $code;
47 1 50       5 if (@$rules) {
48 1         2 my $code_require = '';
49 1         3 my %mem;
50 1         4 for my $rule (@$rules) {
51 1 50       4 next unless $rule->{modules};
52 0         0 for my $mod (keys %{$rule->{modules}}) {
  0         0  
53 0 0       0 next if $mem{$mod}++;
54 0         0 $code_require .= "require $mod;\n";
55             }
56             }
57              
58 1         3 my $expr = '';
59 1         3 for my $i (reverse 0..$#{$rules}) {
  1         4  
60 1 50       7 $expr .= (length($expr) ? ' // ' : '') .
61             "($rules->[$i]{expr_value})";
62             }
63              
64 1         6 $code = join(
65             "",
66             $code_require,
67             "sub { shift // $expr };\n",
68             );
69             } else {
70 0         0 $code = 'sub { shift }';
71             }
72              
73 1 50       5 if ($Log_Default_Value_Code) {
74 0         0 log_trace("Default-value code (gen args: %s): %s", \%args, $code);
75             }
76              
77 1 50       4 return $code if $args{source};
78              
79 1         115 my $default_value_code = eval $code; ## no critic: BuiltinFunctions::ProhibitStringyEval
80 1 50       5 die if $@;
81 1         10 $default_value_code;
82             }
83              
84             1;
85             # ABSTRACT: Default-value rules for Data::Sah
86              
87             __END__