File Coverage

blib/lib/App/Dex.pm
Criterion Covered Total %
statement 38 50 76.0
branch 5 10 50.0
condition n/a
subroutine 10 13 76.9
pod 0 3 0.0
total 53 76 69.7


line stmt bran cond sub pod time code
1             package App::Dex;
2 5     5   262593 use Moo;
  5         48121  
  5         20  
3 5     5   6082 use List::Util qw( first );
  5         8  
  5         448  
4 5     5   2390 use YAML::PP qw( LoadFile );
  5         279478  
  5         279  
5 5     5   2263 use IPC::Run3;
  5         123546  
  5         3009  
6              
7             our $VERSION = '0.002000';
8              
9             has config_file => (
10             is => 'ro',
11             isa => sub { die 'Config file not found' unless $_[0] && -e $_[0] },
12             lazy => 1,
13             default => sub {
14             first { -e $_ } @{shift->config_file_names};
15             },
16             );
17              
18             has config_file_names => (
19             is => 'ro',
20             lazy => 1,
21             default => sub {
22             return [ qw( dex.yaml .dex.yaml ) ],
23             },
24             );
25              
26             has config => (
27             is => 'ro',
28             lazy => 1,
29             builder => sub {
30 5     5   102 LoadFile shift->config_file;
31             },
32             );
33              
34             has menu => (
35             is => 'ro',
36             lazy => 1,
37             builder => sub {
38 4     4   32443 my ( $self ) = @_;
39 4         58 return [ $self->_menu_data( $self->config, 0 ) ];
40             }
41             );
42              
43             sub _menu_data {
44 6     6   51895 my ( $self, $config, $depth ) = @_;
45              
46 6         10 my @menu;
47 6         10 foreach my $block ( @{$config} ) {
  6         10  
48             push @menu, {
49             name => $block->{name},
50             desc => $block->{desc},
51 10         30 depth => $depth,
52             };
53 10 100       23 if ( $block->{children} ) {
54 2         12 push @menu, $self->_menu_data($block->{children}, $depth + 1);
55              
56             }
57             }
58 6         42 return @menu;
59             }
60              
61             sub display_menu {
62 0     0 0 0 my ( $self, $menu ) = @_;
63              
64 0 0       0 $menu = $self->menu unless $menu;
65              
66 0         0 foreach my $item ( @{$menu} ) {
  0         0  
67 0         0 printf( "%s%-24s: %s\n", " " x ( 4 * $item->{depth} ), $item->{name}, $item->{desc} );
68             }
69             }
70              
71             sub resolve_block {
72 1     1 0 3106 my ( $self, $path ) = @_;
73              
74 1         23 return $self->_resolve_block( $path, $self->config );
75             }
76              
77             sub _resolve_block {
78 1     1   21474 my ( $self, $path, $config ) = @_;
79              
80 1         2 my $block;
81 1         2 while ( defined ( my $segment = shift @{$path} ) ) {
  3         9  
82 2     4   7 $block = first { $_->{name} eq $segment } @{$config};
  4         7  
  2         6  
83              
84 2 50       6 die "There is no such command.\n"
85             unless $block;
86              
87 2 100       18 if ( @{$path} ) {
  2         5  
88 1         2 $config = $block->{children};
89 1         2 next;
90             }
91             }
92 1         15 return $block;
93             }
94              
95             sub process_block {
96 0     0 0   my ( $self, $block ) = @_;
97              
98 0 0         if ( $block->{shell} ) {
99 0           _run_block_shell( $block );
100             }
101             }
102              
103             sub _run_block_shell {
104 0     0     my ( $block ) = @_;
105              
106 0           foreach my $command ( @{$block->{shell}} ) {
  0            
107 0           run3( $command );
108             }
109             }
110              
111             1;
112              
113             __END__