File Coverage

blib/lib/App/KV2JSON.pm
Criterion Covered Total %
statement 35 56 62.5
branch 6 14 42.8
condition n/a
subroutine 6 9 66.6
pod 0 3 0.0
total 47 82 57.3


line stmt bran cond sub pod time code
1             package App::KV2JSON;
2 2     2   21129 use 5.008001;
  2         7  
  2         129  
3 2     2   10 use strict;
  2         5  
  2         82  
4 2     2   18 use warnings;
  2         2  
  2         101  
5              
6             our $VERSION = "0.01";
7              
8 2     2   1438 use Encode;
  2         21197  
  2         139  
9 2     2   649 use JSON::PP;
  2         12807  
  2         1055  
10              
11             sub run {
12 0     0 0 0 my ($class, @argv) = @_;
13              
14 0 0       0 if ($argv[0] =~ /^--?h(?:elp)?$/) {
15 0         0 print_usage();
16             }
17              
18 0         0 my @key_values = (_kv_from_pipe(), @argv);
19              
20 0         0 my $hash = kv2hash(@key_values);
21              
22 0         0 my $coder = JSON::PP->new->ascii(1);
23 0         0 print $coder->encode($hash) . "\n";
24             }
25              
26             sub kv2hash {
27 5     5 0 28 my @key_values = @_;
28              
29 5         8 my $hash = {};
30 5         9 for my $kv (@key_values) {
31 9         19 my ($key, $value) = split /=/, $kv, 2;
32 9         52 $value = decode_utf8 $value;
33              
34 9 100       190 if ($key =~ s/\[\]$//) {
35 2         10 $value = [split /,/, $value];
36             }
37              
38 9         12 my @keys;
39 9         30 while ($key =~ s/\[([^\[]*)\]$//) {
40 6         52 unshift @keys, $1;
41             }
42 9         12 unshift @keys, $key;
43              
44 9         8 my $target = $hash;
45 9         16 while (@keys) {
46 15         17 my $key = shift @keys;
47 15 100       21 if (!@keys) {
48 9         14 $target->{$key} = $value;
49 9         17 last;
50             }
51 6 100       12 $target->{$key} = {} unless exists $target->{$key};
52 6         11 $target = $target->{$key};
53             }
54             }
55 5         29 $hash;
56             }
57              
58             sub print_usage {
59 0     0 0   print <<'...';
60             Usage:
61             % kv2json var=baz fruits[]=apple,orange aa[bb]=cc
62             {"fruits":["apple","orange"],"var":"baz","aa":{"bb":"cc"}}
63             ...
64 0           exit;
65             }
66              
67             sub _kv_from_pipe {
68 0     0     my @key_values;
69 0 0         if (-p STDIN) {
70 0           my $continue;
71 0           my $kv = '';
72 0           while (my $line = ) {
73 0           chomp $line;
74 0           $kv .= $line;
75 0 0         $continue = $kv =~ s/\\$// ? 1 : 0;
76 0 0         if (!$continue) {
77 0           push @key_values, $kv;
78 0           $kv = '';
79             }
80             }
81             }
82 0           @key_values;
83             }
84              
85             1;
86             __END__