File Coverage

blib/lib/App/NDTools/NDTool.pm
Criterion Covered Total %
statement 61 76 80.2
branch 8 16 50.0
condition n/a
subroutine 16 20 80.0
pod 0 9 0.0
total 85 121 70.2


line stmt bran cond sub pod time code
1             package App::NDTools::NDTool;
2              
3 7     7   1517 use strict;
  7         14  
  7         222  
4 7     7   35 use warnings FATAL => 'all';
  7         12  
  7         245  
5              
6 7     7   1209 use App::NDTools::INC;
  7         23  
  7         36  
7 7     7   2934 use App::NDTools::Slurp qw(s_dump s_load);
  7         17  
  7         488  
8 7     7   3727 use Encode::Locale qw(decode_argv);
  7         100152  
  7         433  
9 7     7   6126 use Getopt::Long qw(GetOptionsFromArray :config bundling);
  7         75459  
  7         33  
10 7     7   1430 use Log::Log4Cli;
  7         14  
  7         525  
11 7     7   3676 use Struct::Path 0.80 qw(path);
  7         15337  
  7         5691  
12              
13             our $VERSION = '0.28';
14              
15             sub arg_opts {
16 5     5 0 10 my $self = shift;
17              
18             return (
19             'dump-opts' => \$self->{OPTS}->{'dump-opts'},
20             'help|h' => sub {
21 0     0   0 $self->{OPTS}->{help} = 1;
22 0         0 die "!FINISH";
23             },
24             'ifmt=s' => \$self->{OPTS}->{ifmt},
25             'ofmt=s' => \$self->{OPTS}->{ofmt},
26             'pretty!' => \$self->{OPTS}->{pretty},
27             'verbose|v:+' => \$Log::Log4Cli::LEVEL,
28             'version|V' => sub {
29 0     0   0 $self->{OPTS}->{version} = 1;
30 0         0 die "!FINISH";
31             },
32 5         86 );
33             }
34              
35             sub check_args {
36 1     1 0 2 my $self = shift;
37              
38 1 50       4 die_fatal 'At least one argument expected', 1 unless (@_);
39              
40 1         2 return $self;
41             }
42              
43             sub configure {
44 4     4 0 8 my $self = shift;
45              
46 4         5 return $self->check_args(@{$self->{ARGV}});
  4         13  
47             }
48              
49             sub defaults {
50             return {
51 4     4 0 43 'ofmt' => 'JSON',
52             'pretty' => 1,
53             'verbose' => $Log::Log4Cli::LEVEL,
54             };
55             }
56              
57             sub dump_opts {
58 1     1 0 2358 my $self = shift;
59              
60 1         3 delete $self->{OPTS}->{'dump-opts'};
61 1         4 s_dump(\*STDOUT, undef, undef, $self->{OPTS});
62             }
63              
64             sub grep {
65 2     2 0 2112 my ($self, $spaths, @structs) = @_;
66 2         4 my @out;
67              
68 2         4 for my $struct (@structs) {
69 2         2 my $tmp;
70 2         4 for (@{$spaths}) {
  2         4  
71 2         3 my @found = eval { path($struct, $_, deref => 1, paths => 1) };
  2         20  
72 2         652 while (@found) {
73 5         686 my ($p, $r) = splice @found, 0, 2;
74 5         14 path($tmp, $p, assign => $r, expand => 'append');
75             }
76             }
77 2 100       162 push @out, $tmp if (defined $tmp);
78             }
79              
80 2         8 return @out;
81             }
82              
83             sub load_struct {
84 9     9 0 2636 my ($self, $uri, $fmt) = @_;
85              
86 9 0   0   64 log_trace { ref $uri ? "Reading from STDIN" : "Loading '$uri'" };
  0         0  
87 9 50       67 s_load($uri, $fmt) or return undef;
88             }
89              
90             sub new {
91 5     5 0 3881 my $self = bless { ARGV => \@_ }, shift;
92 5         18 $self->{OPTS} = $self->defaults();
93              
94 5         20 decode_argv(Encode::FB_CROAK);
95 5 50       40 unless (GetOptionsFromArray ($self->{ARGV}, $self->arg_opts)) {
96 0         0 $self->usage;
97 0         0 die_fatal "Unsupported opts used", 1;
98             }
99              
100 5 50       5309 if ($self->{OPTS}->{help}) {
101 0         0 $self->usage;
102 0         0 die_info, 0;
103             }
104              
105 5 50       17 if ($self->{OPTS}->{version}) {
106 0         0 print $self->VERSION . "\n";
107 0         0 die_info, 0;
108             }
109              
110 5         21 $self->configure();
111              
112 5 50       18 if ($self->{OPTS}->{'dump-opts'}) {
113 0         0 $self->dump_opts();
114 0         0 die_info, 0;
115             }
116              
117 5         44 return $self;
118             }
119              
120             sub usage {
121 0     0 0   require Pod::Usage;
122 0           Pod::Usage::pod2usage(
123             -exitval => 'NOEXIT',
124             -output => \*STDERR,
125             -sections => 'SYNOPSIS|OPTIONS|EXAMPLES',
126             -verbose => 99
127             );
128             }
129              
130             1; # End of App::NDTools::NDTool