File Coverage

blib/lib/Duadua/CLI.pm
Criterion Covered Total %
statement 50 54 92.5
branch 8 10 80.0
condition 4 4 100.0
subroutine 13 15 86.6
pod 4 4 100.0
total 79 87 90.8


line stmt bran cond sub pod time code
1             package Duadua::CLI;
2 2     2   111273 use strict;
  2         19  
  2         58  
3 2     2   10 use warnings;
  2         4  
  2         46  
4 2     2   806 use Duadua;
  2         5  
  2         74  
5 2     2   1494 use Getopt::Long qw/GetOptionsFromArray/;
  2         21386  
  2         8  
6 2     2   1054 use JSON qw/encode_json/;
  2         8656  
  2         12  
7              
8             sub new {
9 3     3 1 582924 my $class = shift;
10              
11 3         75 return bless {
12             _d => Duadua->new('', { version => 1 }),
13             _opt => $class->_get_opt(@_),
14             }, $class;
15             }
16              
17 3     3 1 821 sub d { shift->{_d} }
18              
19 3     3 1 40 sub opt { $_[0]->{_opt}{$_[1]} }
20              
21             sub run {
22 2     2 1 3605 my ($self) = @_;
23              
24 2         8 my @results;
25              
26 2 100       7 if (my $ua_list = $self->opt('ua_list')) {
27 1         9 for my $ua (@{$ua_list}) {
  1         14  
28 1         24 push @results, $self->_parse($ua);
29             }
30             }
31              
32 2 100       9 if ($self->_is_opened_stdin) {
33 1         11 while (my $ua = ) {
34 1         4 chomp $ua;
35 1         3 push @results, $self->_parse($ua);
36             }
37             }
38              
39 2 50       9 if (scalar @results == 0) {
40 0         0 _show_usage(1);
41             }
42             else {
43 2 50       159 print encode_json(scalar @results == 1 ? $results[0] : \@results);
44             }
45             }
46              
47 1     1   13 sub _is_opened_stdin { -p STDIN }
48              
49             sub _parse {
50 2     2   25 my ($self, $ua) = @_;
51              
52 2         14 $ua =~ s!^"!!g;
53 2         13 $ua =~ s!"$!!g;
54              
55 2         8 my $r = $self->d->reparse($ua);
56              
57 2   100     7 my $v = {
58             ua => $r->ua,
59             name => $r->name,
60             version => $r->version || '-',
61             };
62              
63 2         10 for my $k (qw/
64             is_bot
65             is_ios
66             is_android
67             is_linux
68             is_windows
69             is_chromeos
70             /) {
71 12   100     39 $v->{$k} = $r->$k || 0;
72             }
73              
74 2         9 return $v;
75             }
76              
77             sub _get_opt {
78 3     3   40 my ($class, @argv) = @_;
79              
80 3         31 my $opt = {};
81              
82             GetOptionsFromArray(
83             \@argv,
84             'help' => sub {
85 0     0   0 $class->_show_usage(1);
86             },
87             'version' => sub {
88 0     0   0 print "$0 $Duadua::VERSION\n";
89 0         0 exit 1;
90             },
91 3         124 );
92              
93 3 100       1118 if (scalar @argv > 0) {
94 2         17 push @{$opt->{ua_list}}, @argv;
  2         29  
95             }
96              
97 3         57 return $opt;
98             }
99              
100             sub _show_usage {
101 1     1   91 my ($class, $exitval) = @_;
102              
103 1         577 require Pod::Usage;
104 1         54996 Pod::Usage::pod2usage(-exitval => $exitval);
105             }
106              
107             1;
108              
109             __END__