File Coverage

blib/lib/Data/Smile/XS.pm
Criterion Covered Total %
statement 58 66 87.8
branch 32 50 64.0
condition 8 21 38.1
subroutine 9 9 100.0
pod 2 2 100.0
total 109 148 73.6


line stmt bran cond sub pod time code
1 10     10   2333753 use 5.008008;
  10         46  
2 10     10   71 use strict;
  10         85  
  10         339  
3 10     10   49 use warnings;
  10         20  
  10         1450  
4              
5             package Data::Smile::XS;
6              
7             our $AUTHORITY = 'cpan:TOBYINK';
8             our $VERSION = '0.001000';
9              
10             require XSLoader;
11             XSLoader::load( __PACKAGE__, $VERSION );
12              
13 10     10   5693 use Exporter::Tiny;
  10         64261  
  10         78  
14             our @ISA = qw( Exporter::Tiny );
15             our @EXPORT_OK = qw( encode_smile decode_smile dump_smile load_smile );
16              
17             sub _is_pathish_filename {
18 24     24   60 my ( $x ) = @_;
19 24 100       108 return 0 if not ref $x;
20 19 100 66     43 return 1 if eval { $x->isa( 'Path::Tiny' ) } or eval { $x->isa( 'Path::Class::File' ) };
  19         223  
  1         6  
21 1         2 return 0;
22             }
23              
24             sub _open_for_read {
25 19     19   72 my ( $file ) = @_;
26              
27 19 100       84 if ( _is_pathish_filename( $file ) ) {
28 17         114 $file = "$file";
29             }
30              
31 19 50       170 if ( not ref $file ) {
32 19 50       1494 open my $fh, '<:raw', $file or die "open($file) for read: $!";
33 19         119 return ( $fh, 1 );
34             }
35              
36 0 0 0     0 if ( eval { $file->can( 'read' ) } or eval { $file->can( 'getline' ) } or ref( $file ) eq 'GLOB' ) {
  0   0     0  
  0         0  
37 0         0 binmode( $file, ':raw' );
38 0         0 return ( $file, 0 );
39             }
40              
41 0         0 die "Unsupported file argument for read";
42             }
43              
44             sub _open_for_write {
45 5     5   13 my ( $file ) = @_;
46              
47 5 100       21 if ( _is_pathish_filename( $file ) ) {
48 1         21 $file = "$file";
49             }
50              
51 5 100       38 if ( not ref $file ) {
52 4 50       510 open my $fh, '>:raw', $file or die "open($file) for write: $!";
53 4         26 return ( $fh, 1 );
54             }
55              
56 1 0 33     1 if ( eval { $file->can( 'print' ) } or eval { $file->can( 'write' ) } or ref( $file ) eq 'GLOB' ) {
  1   33     9  
  0         0  
57 1         4 binmode( $file, ':raw' );
58 1         3 return ( $file, 0 );
59             }
60              
61 0         0 die "Unsupported file argument for write";
62             }
63              
64             sub dump_smile {
65 5     5 1 631244 my ( $file, $data, $opts ) = @_;
66 5 50       23 die 'dump_smile expects at most 3 arguments' if @_ > 3;
67              
68 5 100 66     26 if ( @_ >= 3 and defined $opts ) {
69 2 50       9 die 'Options must be a hash reference' if ref( $opts ) ne 'HASH';
70             }
71              
72 5         25 my ( $fh, $close ) = _open_for_write( $file );
73              
74 5         122 my $bytes = encode_smile( $data, $opts );
75 4 50       10 my $ok = eval {
76 4 50       9 print {$fh} $bytes or die "write: $!";
  4         65  
77 4         973 1;
78             } ? 1 : 0;
79              
80 4 100       29 if ( $close ) {
81 3 50       208 close $fh or $ok = 0;
82             }
83              
84 4 50       46 return $ok ? 1 : 0;
85             }
86              
87             sub load_smile {
88 19     19 1 27510347 my ( $file, $opts ) = @_;
89 19 50       100 die 'load_smile expects at most 2 arguments' if @_ > 2;
90              
91 19 100 66     102 if ( @_ >= 2 and defined $opts ) {
92 1 50       5 die 'Options must be a hash reference' if ref( $opts ) ne 'HASH';
93             }
94              
95 19         112 my ( $fh, $close ) = _open_for_read( $file );
96              
97 19         37 my $buf = do { local $/; <$fh> };
  19         156  
  19         10316  
98 19 50       92 die "read failed" if not defined $buf;
99              
100 19 50       59 if ( $close ) {
101 19 50       286 close $fh or die "close: $!";
102             }
103              
104 19 100       31711 return defined $opts
105             ? decode_smile( $buf, $opts )
106             : decode_smile( $buf );
107             }
108              
109             __END__