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 2     2   583707 use 5.010001;
  2         9  
4 2     2   13 use strict;
  2         4  
  2         74  
5 2     2   12 use warnings;
  2         5  
  2         139  
6 2     2   12 no warnings 'once';
  2         6  
  2         93  
7 2     2   4821 use Log::ger;
  2         131  
  2         13  
8              
9 2     2   1871 use Data::Sah::DefaultValueCommon;
  2         6  
  2         110  
10 2     2   21 use Exporter qw(import);
  2         4  
  2         1124  
11              
12             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
13             our $DATE = '2024-01-17'; # DATE
14             our $DIST = 'Data-Sah-DefaultValue'; # DIST
15             our $VERSION = '0.005'; # VERSION
16              
17             our @EXPORT_OK = qw(gen_default_value_code);
18              
19             our %SPEC;
20              
21             our $Log_Default_Value_Code = $ENV{LOG_SAH_DEFAULT_VALUE_CODE} // 0;
22              
23             $SPEC{gen_default_value_code} = {
24             v => 1.1,
25             summary => 'Generate code to set default value',
26             description => <<'_',
27              
28             This is mostly for testing. Normally the default value rules will be used from
29             via the `x.perl.default_value_rules` or
30             `x.js.default_value_rules` or `x.default_value_rules` property.
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 2     2 1 280494 my %args = @_;
40              
41 2         11 my $rules = Data::Sah::DefaultValueCommon::get_default_value_rules(
42             %args,
43             compiler=>'perl',
44             );
45              
46 2         24 my $code;
47 2 50       4 if (@$rules) {
48 2         4 my $code_require = '';
49 2         3 my %mem;
50 2         3 for my $rule (@$rules) {
51 2 50       6 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 2         3 my $expr = '';
59 2         4 for my $i (reverse 0..$#{$rules}) {
  2         3  
60 2 50       7 $expr .= (length($expr) ? ' // ' : '') .
61             "($rules->[$i]{expr_value})";
62             }
63              
64 2         6 $code = join(
65             "",
66             $code_require,
67             "sub { shift // $expr };\n",
68             );
69             } else {
70 0         0 $code = 'sub { shift }';
71             }
72              
73 2 50       5 if ($Log_Default_Value_Code) {
74 0         0 log_trace("Default-value code (gen args: %s): %s", \%args, $code);
75             }
76              
77 2 50       3 return $code if $args{source};
78              
79 2         140 my $default_value_code = eval $code; ## no critic: BuiltinFunctions::ProhibitStringyEval
80 2 50       6 die if $@;
81 2         15 $default_value_code;
82             }
83              
84             1;
85             # ABSTRACT: Default-value rules for Data::Sah
86              
87             __END__