Initial implementation
[scpubgit/JSON-Diffable.git] / lib / JSON / Diffable.pm
CommitLineData
dd1bf371 1use strictures 1;
2
3package JSON::Diffable;
4
5use JSON ();
6use Exporter 'import';
7
8my $real = JSON->new->allow_nonref->utf8;
9
10our @EXPORT_OK = qw( encode_json );
11
12sub encode_json {
13 my $data = shift;
14 return _encode($data, 0);
15}
16
17sub _indent {
18 my $str = shift;
19 $str =~ s{^}{ }gm;
20 return $str;
21}
22
23sub _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
481;