File Coverage

blib/lib/Getopt/Yath/Option/Map.pm
Criterion Covered Total %
statement 76 89 85.3
branch 11 22 50.0
condition 8 12 66.6
subroutine 20 21 95.2
pod 0 15 0.0
total 115 159 72.3


line stmt bran cond sub pod time code
1             package Getopt::Yath::Option::Map;
2 1     1   6 use strict;
  1         1  
  1         47  
3 1     1   4 use warnings;
  1         1  
  1         70  
4              
5             our $VERSION = '2.000007';
6              
7 1     1   4 use Getopt::Yath::Util qw/decode_json/;
  1         1  
  1         7  
8              
9 1     1   28 use parent 'Getopt::Yath::Option';
  1         1  
  1         7  
10 1     1   81 use Getopt::Yath::HashBase qw/
  1         1  
  1         6  
11              
12 4     4 0 7 sub allows_list { 1 }
13 1     1 0 3 sub allows_default { 1 }
14 6     6 0 19 sub allows_arg { 1 }
15 5     5 0 11 sub requires_arg { 1 }
16 0     0 0 0 sub allows_autofill { 0 }
17 1     1 0 2 sub requires_autofill { 0 }
18              
19 4     4 0 14 sub notes { (shift->SUPER::notes(), 'Can be specified multiple times') }
20              
21             sub _example_append {
22 4     4   5 my $self = shift;
23 4         8 my ($params, @prefixes) = @_;
24              
25 4 50       6 return unless $self->allows_list;
26              
27 4   100     11 my $groups = $params->{groups} // {};
28              
29 4         6 my @out;
30              
31 4         5 for my $prefix (@prefixes) {
32 10         17 for my $group (sort keys %$groups) {
33 5         9 push @out => "${prefix}${group} KEY1 VAL KEY2 ${group} VAL1 VAL2 ... $groups->{$group} ... $groups->{$group}";
34             }
35             }
36              
37 4         8 return @out;
38             }
39              
40             sub default_long_examples {
41 2     2 0 3 my $self = shift;
42 2         5 my %params = @_;
43              
44 2         8 my @append = $self->_example_append(\%params, ' ', '=');
45              
46 2         11 return [' key=val', '=key=val', qq[ '{"json":"hash"}'], qq[='{"json":"hash"}'], @append];
47             }
48              
49             sub default_short_examples {
50 2     2 0 4 my $self = shift;
51 2         5 my %params = @_;
52              
53 2         6 my @append = $self->_example_append(\%params, '', ' ', '=');
54              
55 2         10 return [' key=val', 'key=value', '=key=val', qq[ '{"json":"hash"}'], qq[='{"json":"hash"}'], @append];
56             }
57              
58             sub init {
59 2     2 0 2 my $self = shift;
60              
61 2         9 $self->SUPER::init();
62              
63 2   50     8 $self->{+KEY_ON} //= '=';
64             }
65              
66 48 100   48 0 60 sub is_populated { ${$_[1]} && keys %{${$_[1]}} }
  7         8  
  7         19  
  48         115  
67              
68             sub get_initial_value {
69 54     54 0 67 my $self = shift;
70              
71 54         63 my %val;
72              
73 54         87 my $env = $self->from_env_vars;
74 54 50       72 for my $name (@{$env || []}) {
  54         161  
75 0 0       0 $val{$name} = $ENV{$name} if defined $ENV{$name};
76             }
77              
78 54 50       131 return \%val if keys %val;
79              
80 54 50       104 return undef if $self->{+MAYBE};
81              
82 54   50     159 return $self->_get___value(INITIALIZE()) // {};
83             }
84              
85             sub get_clear_value {
86 2     2 0 3 my $self = shift;
87 2   50     6 return $self->_get___value(CLEAR(), @_) // {};
88             }
89              
90             sub add_value {
91 105     105 0 249 my $self = shift;
92 105         193 my ($ref, %vals) = @_;
93              
94 105 100       212 return unless keys %vals;
95              
96 51   100     179 $$ref //= {};
97              
98 51         213 %{$$ref} = (
99 51         63 %{$$ref},
  51         113  
100             %vals,
101             );
102             }
103              
104             sub normalize_value {
105 8     8 0 6 my $self = shift;
106 8         13 my (@input) = @_;
107              
108 8 50       16 return $self->SUPER::normalize_value(@input) if @input > 1;
109              
110 8 50       15 if ($input[0] =~ m/^\s*\{.*\}\s*$/s) {
111 0         0 my $out;
112 0         0 local $@;
113 0 0       0 unless (eval { local $SIG{__DIE__}; $out = decode_json($input[0]); 1 }) {
  0         0  
  0         0  
  0         0  
114 0         0 my ($err) = split /[\n\r]+/, $@;
115 0         0 $err =~ s{at \Q$INC{'Getopt/Yath/Util/JSON.pm'}\E line \d+\..*$}{};
116 0         0 die "Could not decode JSON string: $err\n====\n$input[0]\n====\n";
117             }
118 0         0 return %$out;
119             }
120              
121 8         7 my @split;
122 8 50       16 if (my $on = $self->split_on) {
123 8         14 @split = grep { length($_) } map { split($on, $_) } @input;
  10         23  
  8         123  
124             }
125             else {
126 0         0 @split = @input;
127             }
128              
129 8   50     21 my $key_on = $self->key_on // '=';
130 8         9 my %output = map { my ($k, $v) = split($key_on, $_, 2); $self->SUPER::normalize_value($k, $v) } @split;
  10         65  
  10         24  
131              
132 8         25 return %output;
133             }
134              
135             1;
136              
137             __END__