File Coverage

blib/lib/App/LJ.pm
Criterion Covered Total %
statement 40 63 63.4
branch 7 18 38.8
condition 2 6 33.3
subroutine 9 14 64.2
pod 0 4 0.0
total 58 105 55.2


line stmt bran cond sub pod time code
1             package App::LJ;
2 2     2   16270 use 5.008001;
  2         8  
  2         68  
3 2     2   9 use strict;
  2         4  
  2         59  
4 2     2   15 use warnings;
  2         3  
  2         82  
5              
6             our $VERSION = "0.01";
7              
8 2     2   1378 use JSON::XS ();
  2         10255  
  2         55  
9 2     2   871 use JSON::Color ();
  2         22618  
  2         992  
10              
11             my $_coder;
12             sub _coder {
13 1   33 1   51 $_coder ||= JSON::XS->new->pretty(1);
14             }
15              
16             sub new_with_options {
17 0     0 0 0 my ($class, @argv) = @_;
18              
19 0         0 my ($opt) = $class->parse_options(@argv);
20 0         0 $class->new($opt);
21             }
22              
23             sub parse_options {
24 0     0 0 0 my ($class, @argv) = @_;
25              
26 0 0       0 if (grep /^--?h(?:elp)?$/, @argv) {
27 0         0 _print_usage();
28             }
29              
30 0         0 my $opt = {};
31 0         0 my @rest;
32 0         0 for my $v (@argv) {
33 0 0       0 if ($v eq '--no-color') {
34 0         0 $opt->{color} = undef;
35 0         0 next;
36             }
37 0         0 push @rest, $v;
38             }
39 0         0 ($opt, \@rest)
40             }
41              
42             sub new {
43 1     1 0 12 my $class = shift;
44 1 50       5 my $opt = @_ == 1 ? $_[0] : {@_};
45 1 50       4 unless (exists $opt->{color}) {
46 0         0 $opt->{color} = 1;
47             }
48 1         3 bless $opt, $class;
49             }
50              
51             sub _pretty_print {
52 1     1   2 my ($self, $json) = @_;
53              
54 1   33     7 ($self->{printer} ||= do {
55 1     0   21 !$self->{color} ? sub { chomp(my $l = $_coder->encode(shift)); $l} : sub { JSON::Color::encode_json(shift, {pretty => 1}) }
  1         3  
  0         0  
56 1 50       12 })->($json);
57             }
58              
59             sub run {
60 0     0 0 0 my $self = shift;
61 0         0 print $self->_process_line($_) . "\n" while ;
62             }
63              
64             sub _process_line {
65 1     1   6 my ($self, $line) = @_;
66 1         3 chomp $line;
67              
68 1 50       14 if ($line =~ /\s*\{.*\}\s*/) {
69 1         3 my $pre = $`;
70 1         2 my $maybe_json = $&;
71 1         2 my $post = $';
72              
73 1         1 my $json;
74 1         2 eval {
75 1         4 $json = _coder->decode($maybe_json);
76             };
77 1 50       4 if (!$@) {
78 1         5 my $r = '';
79 1 50       4 $r .= "$pre\n" if $pre ne '';
80 1         3 $r .= $self->_pretty_print($json);
81 1 50       4 $r .= "\n$post" if $post ne '';
82 1         7 return $r;
83             }
84             }
85 0           return $line;
86             }
87              
88             sub _print_usage {
89 0     0     my $pretty = JSON::Color::encode_json({key => "value", array => [1,2,3]}, {pretty => 1});
90 0           $pretty =~ s/^/ /msg;
91              
92 0           print <<'...', $pretty , "\n";
93             Usage:
94             % echo '2015-01-31 [21:06:22] json: {"key": "value", "array": [1,2,3]}' | lj [--no-color]'
95             2015-01-31 [21:06:22] json:
96             ...
97 0           exit;
98             }
99              
100              
101             1;
102             __END__