File Coverage

blib/lib/App/LJ.pm
Criterion Covered Total %
statement 41 63 65.0
branch 9 18 50.0
condition 4 6 66.6
subroutine 10 14 71.4
pod 0 4 0.0
total 64 105 60.9


line stmt bran cond sub pod time code
1             package App::LJ;
2 2     2   16645 use 5.008001;
  2         8  
  2         75  
3 2     2   11 use strict;
  2         2  
  2         74  
4 2     2   19 use warnings;
  2         4  
  2         90  
5              
6             our $VERSION = "0.02";
7              
8 2     2   1454 use JSON::XS ();
  2         12477  
  2         66  
9 2     2   1139 use JSON::Color ();
  2         26666  
  2         1077  
10              
11             my $_coder;
12             sub _coder {
13 3   66 3   87 $_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 9 my $class = shift;
44 1 50       5 my $opt = @_ == 1 ? $_[0] : {@_};
45 1 50       3 unless (exists $opt->{color}) {
46 0         0 $opt->{color} = 1;
47             }
48 1         3 bless $opt, $class;
49             }
50              
51             sub _pretty_print {
52 2     2   3 my ($self, $json) = @_;
53              
54 2   66     9 ($self->{printer} ||= do {
55 2     2   29 !$self->{color} ? sub { chomp(my $l = $_coder->encode(shift)); $l} : sub { JSON::Color::encode_json(shift, {pretty => 1}) }
  2         8  
  0         0  
56 1 50       9 })->($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 4     4   13 my ($self, $line) = @_;
66 4         10 chomp $line;
67              
68 4 100       30 if ($line =~ /\s*\[?\{.*\}\]?\s*/) {
69 3         6 my $pre = $`;
70 3         6 my $maybe_json = $&;
71 3         6 my $post = $';
72              
73 3         2 my $json;
74 3         3 eval {
75 3         8 $json = _coder->decode($maybe_json);
76             };
77 3 100       11 if (!$@) {
78 2         5 my $r = '';
79 2 50       8 $r .= "$pre\n" if $pre ne '';
80 2         5 $r .= $self->_pretty_print($json);
81 2 50       5 $r .= "\n$post" if $post ne '';
82 2         15 return $r;
83             }
84             }
85 2         9 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__