File Coverage

blib/lib/App/NDTools/NDProc/Module/Insert.pm
Criterion Covered Total %
statement 53 54 98.1
branch 14 14 100.0
condition 6 6 100.0
subroutine 17 18 94.4
pod 0 5 0.0
total 90 97 92.7


line stmt bran cond sub pod time code
1             package App::NDTools::NDProc::Module::Insert;
2              
3 4     4   65932 use strict;
  4         17  
  4         151  
4 4     4   25 use warnings FATAL => 'all';
  4         9  
  4         152  
5 4     4   450 use parent 'App::NDTools::NDProc::Module';
  4         289  
  4         24  
6              
7 4     4   274 use Log::Log4Cli;
  4         10  
  4         321  
8 4     4   26 use Scalar::Util qw(looks_like_number);
  4         9  
  4         226  
9 4     4   24 use Struct::Path 0.80 qw(path);
  4         68  
  4         195  
10              
11 4     4   26 use App::NDTools::Util qw(chomp_evaled_error);
  4         8  
  4         2757  
12              
13             our $VERSION = '0.18';
14              
15 1     1 0 6 sub MODINFO { "Insert value into structure" }
16              
17             sub arg_opts {
18 29     29 0 50 my $self = shift;
19              
20             return (
21             $self->SUPER::arg_opts(),
22             'boolean=s' => sub {
23 10 100 100 10   10191 if ($_[1] eq '1' or $_[1] =~ /^(T|t)rue$/) {
    100 100        
24 3         16 $self->{OPTS}->{value} = JSON::true;
25             } elsif ($_[1] eq '0' or $_[1] =~ /^(F|f)alse$/) {
26 3         14 $self->{OPTS}->{value} = JSON::false;
27             } else {
28 4         11 $self->{ARG_ERROR} = "Unsuitable value for --boolean";
29 4         17 die "!FINISH";
30             }
31             },
32             'file|f=s' => \$self->{OPTS}->{file},
33             'file-fmt=s' => \$self->{OPTS}->{'file-fmt'},
34 2     2   1924 'null|undef' => sub { $self->{OPTS}->{value} = undef },
35             'number=s' => sub {
36 6 100   6   5939 if (looks_like_number($_[1])) {
37 5         25 $self->{OPTS}->{value} = 0 + $_[1];
38             } else {
39 1         4 $self->{ARG_ERROR} = "Unsuitable value for --number";
40 1         6 die "!FINISH";
41             }
42             },
43 5     5   4795 'string|value=s' => sub { $self->{OPTS}->{value} = $_[1] },
44             )
45 29         91 }
46              
47             sub check_rule {
48 24     24 0 54 my ($self, $rule) = @_;
49 24         44 my $out = $self;
50              
51 24 100       66 unless (exists $rule->{value}) {
52 1     1   8 log_error { "Value to insert should be defined" };
  1         78  
53 1         7 $out = undef;
54             }
55              
56 24 100       48 push @{$rule->{path}}, '' unless (@{$rule->{path}});
  1         5  
  24         64  
57              
58 24         80 return $out;
59             }
60              
61             sub configure {
62 74     74 0 128 my $self = shift;
63              
64             $self->{OPTS}->{value} =
65             $self->load_struct($self->{OPTS}->{file}, $self->{OPTS}->{'file-fmt'})
66 74 100       247 if (defined $self->{OPTS}->{file});
67             }
68              
69             sub process_path {
70 24     24 0 72 my ($self, $data, $path, $spath, $opts) = @_;
71              
72 24     0   141 log_info { 'Updating path "' . $path . '"' };
  0         0  
73 24         117 eval { path(${$data}, $spath, assign => $opts->{value}, expand => 1) };
  24         44  
  24         98  
74 24 100       4244 die_fatal "Failed to lookup path '$path' (" .
75             chomp_evaled_error($@) . ")", 4 if ($@);
76             }
77              
78              
79             1; # End of App::NDTools::NDProc::Module::Insert
80              
81             __END__