File Coverage

blib/lib/JSON/Create.pm
Criterion Covered Total %
statement 45 53 84.9
branch 11 16 68.7
condition 7 9 77.7
subroutine 8 10 80.0
pod 7 8 87.5
total 78 96 81.2


line stmt bran cond sub pod time code
1             package JSON::Create;
2 48     48   4947071 use warnings;
  48         99  
  48         2885  
3 48     48   480 use strict;
  48         109  
  48         40744  
4             require Exporter;
5             our @ISA = qw(Exporter);
6             our @EXPORT_OK = qw/create_json create_json_strict write_json/;
7             our %EXPORT_TAGS = (
8             all => \@EXPORT_OK,
9             );
10             our $VERSION = '0.36';
11              
12             # Are we running as XS?
13              
14             our $noxs;
15              
16             # The environment variable JSONCreatePP controls whether this runs as
17             # XS or purely Perl.
18              
19             $noxs = $ENV{JSONCreatePP};
20              
21             # Did the XS load OK?
22              
23             our $xsok;
24              
25             if (! $noxs) {
26             eval {
27             require XSLoader;
28             XSLoader::load ('JSON::Create', $VERSION);
29             $xsok = 1;
30             };
31             if ($@) {
32             $xsok = 0;
33             }
34             }
35              
36             if (! $xsok || $noxs) {
37             require JSON::Create::PP;
38             JSON::Create::PP->import (':all');
39             }
40              
41             sub set_fformat
42             {
43 8     8 1 1597 my ($obj, $fformat) = @_;
44 8 50       18 if (! $fformat) {
45 0         0 $obj->set_fformat_unsafe (0);
46 0         0 return;
47             }
48 8 100       45 if ($fformat =~ /^%(?:(?:([0-9]+)?(?:\.([0-9]+)?)?)?[fFgGeE])$/) {
49 6         11 my $d1 = $1;
50 6         14 my $d2 = $2;
51 6 100 66     42 if ((defined ($d1) && $d1 > 20) || (defined ($d2) && $d2 > 20)) {
      100        
      66        
52 2         20 warn "Format $fformat is too long";
53 2         16 $obj->set_fformat_unsafe (0);
54             }
55             else {
56 4         17 $obj->set_fformat_unsafe ($fformat);
57             }
58             }
59             else {
60 2         19 warn "Format $fformat is not OK for floating point numbers";
61 2         13 $obj->set_fformat_unsafe (0);
62             }
63             }
64              
65             sub bool
66             {
67 4     4 1 2740 my ($obj, @list) = @_;
68 4         19 my $handlers = $obj->get_handlers ();
69 4         9 for my $item (@list) {
70 4         15 $handlers->{$item} = 'bool';
71             }
72             }
73              
74             sub obj
75             {
76 4     4 1 1429 my ($obj, %handlers) = @_;
77 4         15 my $handlers = $obj->get_handlers ();
78 4         13 for my $item (keys %handlers) {
79 5         8 my $value = $handlers{$item};
80             # Check it's a code reference somehow.
81 5         14 $handlers->{$item} = $value;
82             }
83             }
84              
85             sub del
86             {
87 0     0 0 0 my ($obj, @list) = @_;
88 0         0 my $handlers = $obj->get_handlers ();
89 0         0 for my $item (@list) {
90 0         0 delete $handlers->{$item};
91             }
92             }
93              
94             sub validate
95             {
96 2     2 1 972 my ($obj, $value) = @_;
97 2 50       7 if ($value) {
98 2         977 require JSON::Parse;
99 2         2987 JSON::Parse->import ('assert_valid_json');
100             }
101 2         11 $obj->set_validate ($value);
102             }
103              
104             sub new
105             {
106 48     48 1 4027738 my ($class, %args) = @_;
107 48         94 my $jc;
108 48 100       219 if ($xsok) {
109 24         420 $jc = bless jcnew (), $class;
110             }
111             else {
112 24         132 $jc = JSON::Create::PP->new ();
113             }
114 48         288 $jc->set (%args);
115 48         132 return $jc;
116             }
117              
118             sub write_json
119             {
120 2     2 1 360513 my ($filename, $obj, %options) = @_;
121 2         66 my $json = create_json ($obj, %options);
122             # create_json's output is either ASCII or it is marked as utf8, so
123             # the following is always safe.
124 2         6 my $encoding = ':encoding(utf8)';
125 2 50       9 if ($options{downgrade_utf8}) {
126 0         0 $encoding = ':raw';
127             }
128 2 50       327 open my $out, ">$encoding", $filename or die $!;
129 2         124 print $out $json;
130 2 50       162 close $out or die $!;
131             }
132              
133             sub run
134             {
135 0     0 1   goto &create;
136             }
137              
138             1;