File Coverage

blib/lib/App/KV2JSON.pm
Criterion Covered Total %
statement 48 62 77.4
branch 11 18 61.1
condition n/a
subroutine 8 9 88.8
pod 0 3 0.0
total 67 92 72.8


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