Initial implementation
[scpubgit/JSON-Diffable.git] / lib / JSON / Diffable.pm
1 use strictures 1;
2
3 package JSON::Diffable;
4
5 use JSON ();
6 use Exporter 'import';
7
8 my $real = JSON->new->allow_nonref->utf8;
9
10 our @EXPORT_OK = qw( encode_json );
11
12 sub encode_json {
13     my $data = shift;
14     return _encode($data, 0);
15 }
16
17 sub _indent {
18     my $str = shift;
19     $str =~ s{^}{  }gm;
20     return $str;
21 }
22
23 sub _encode {
24     my $data = shift;
25     if (ref $data eq 'HASH') {
26         return sprintf "{\n%s}",
27             join '',
28             map {
29                 my $key  = $real->encode($_);
30                 my $data = _encode($data->{$_});
31                 _indent("$key: $data") . ",\n";
32             }
33             sort keys %$data;
34     }
35     elsif (ref $data eq 'ARRAY') {
36         return sprintf "[\n%s]",
37             join '',
38             map {
39                 _indent(_encode($_)) . ",\n";
40             }
41             @$data;
42     }
43     else {
44         return $real->encode($data);
45     }
46 }
47
48 1;