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   3680322 use warnings;
  48         586  
  48         1844  
3 48     48   276 use strict;
  48         97  
  48         44125  
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.35';
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 2206 my ($obj, $fformat) = @_;
44 8 50       28 if (! $fformat) {
45 0         0 $obj->set_fformat_unsafe (0);
46 0         0 return;
47             }
48 8 100       58 if ($fformat =~ /^%(?:(?:([0-9]+)?(?:\.([0-9]+)?)?)?[fFgGeE])$/) {
49 6         18 my $d1 = $1;
50 6         15 my $d2 = $2;
51 6 100 66     79 if ((defined ($d1) && $d1 > 20) || (defined ($d2) && $d2 > 20)) {
      100        
      66        
52 2         33 warn "Format $fformat is too long";
53 2         24 $obj->set_fformat_unsafe (0);
54             }
55             else {
56 4         22 $obj->set_fformat_unsafe ($fformat);
57             }
58             }
59             else {
60 2         48 warn "Format $fformat is not OK for floating point numbers";
61 2         23 $obj->set_fformat_unsafe (0);
62             }
63             }
64              
65             sub bool
66             {
67 4     4 1 2695 my ($obj, @list) = @_;
68 4         20 my $handlers = $obj->get_handlers ();
69 4         13 for my $item (@list) {
70 4         18 $handlers->{$item} = 'bool';
71             }
72             }
73              
74             sub obj
75             {
76 4     4 1 1595 my ($obj, %handlers) = @_;
77 4         17 my $handlers = $obj->get_handlers ();
78 4         13 for my $item (keys %handlers) {
79 5         10 my $value = $handlers{$item};
80             # Check it's a code reference somehow.
81 5         17 $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 1138 my ($obj, $value) = @_;
97 2 50       10 if ($value) {
98 2         1191 require JSON::Parse;
99 2         2914 JSON::Parse->import ('assert_valid_json');
100             }
101 2         17 $obj->set_validate ($value);
102             }
103              
104             sub new
105             {
106 48     48 1 349178 my ($class, %args) = @_;
107 48         108 my $jc;
108 48 100       183 if ($xsok) {
109 24         452 $jc = bless jcnew (), $class;
110             }
111             else {
112 24         155 $jc = JSON::Create::PP->new ();
113             }
114 48         308 $jc->set (%args);
115 48         186 return $jc;
116             }
117              
118             sub write_json
119             {
120 2     2 1 1665 my ($filename, $obj, %options) = @_;
121 2         61 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         16 my $encoding = ':encoding(utf8)';
125 2 50       8 if ($options{downgrade_utf8}) {
126 0         0 $encoding = ':raw';
127             }
128 2 50       150 open my $out, ">$encoding", $filename or die $!;
129 2         168 print $out $json;
130 2 50       167 close $out or die $!;
131             }
132              
133             sub run
134             {
135 0     0 1   goto &create;
136             }
137              
138             1;