File Coverage

blib/lib/TableDataRole/Munge/SerializeRef.pm
Criterion Covered Total %
statement 11 47 23.4
branch 0 12 0.0
condition 0 4 0.0
subroutine 4 13 30.7
pod 1 8 12.5
total 16 84 19.0


line stmt bran cond sub pod time code
1             package TableDataRole::Munge::SerializeRef;
2              
3 1     1   416653 use 5.010001;
  1         5  
4 1     1   7 use strict;
  1         2  
  1         33  
5 1     1   5 use warnings;
  1         3  
  1         105  
6              
7 1     1   563 use Role::Tiny;
  1         10199  
  1         11  
8              
9             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
10             our $DATE = '2024-05-14'; # DATE
11             our $DIST = 'TableDataRoles-Standard'; # DIST
12             our $VERSION = '0.025'; # VERSION
13              
14             with 'TableDataRole::Spec::Basic';
15              
16             sub new {
17 0     0 1   require Module::Load::Util;
18              
19 0           my ($class, %args) = @_;
20              
21 0 0         my $tabledata = delete $args{tabledata} or die "Please specify 'tabledata' argument";
22 0   0       my $load = delete($args{load}) // 1;
23 0   0       my $serializer = delete($args{serializer}) // 'json';
24 0 0         die "Unknown argument(s): ". join(", ", sort keys %args)
25             if keys %args;
26              
27 0           my $td = Module::Load::Util::instantiate_class_with_optional_args(
28             {load=>$load, ns_prefix=>"TableData"}, $tabledata);
29              
30 0 0         if ($serializer eq 'json') {
    0          
31 0           require JSON::MaybeXS;
32             $serializer = sub {
33 0     0     JSON::MaybeXS::encode_json($_[0]);
34 0           };
35             } elsif (ref($serializer) ne 'CODE') {
36 0           die "Invalid value for serializer '$serializer': please supply a coderef or 'json'";
37             }
38              
39             bless {
40 0           tabledata => $tabledata,
41             td => $td,
42             pos => 0,
43             serializer => $serializer,
44             }, $class;
45             }
46              
47             sub get_column_count {
48 0     0 0   my $self = shift;
49 0           $self->{td}->get_column_count;
50             }
51              
52             sub get_column_names {
53 0     0 0   my $self = shift;
54 0           $self->{td}->get_column_names;
55             }
56              
57             sub has_next_item {
58 0     0 0   my $self = shift;
59 0           $self->{td}->has_next_item;
60             }
61              
62             sub get_next_item {
63 0     0 0   my $self = shift;
64 0           my $row = $self->{td}->get_next_item;
65 0           for (@$row) {
66 0 0         if (ref $_) { $_ = $self->{serializer}->($_) }
  0            
67             }
68 0           $row;
69             }
70              
71             sub get_next_row_hashref {
72 0     0 0   my $self = shift;
73 0           my $row = $self->get_next_item;
74 0 0         unless ($self->{_column_names}) {
75 0           $self->{_column_names} = $self->{td}->get_column_names;
76             }
77 0           +{ map {($self->{_column_names}->[$_] => $row->[$_])} 0..$#{$row} };
  0            
  0            
78             }
79              
80             sub get_iterator_pos {
81 0     0 0   my $self = shift;
82 0           $self->{td}->get_iterator_pos;
83             }
84              
85             sub reset_iterator {
86 0     0 0   my $self = shift;
87 0           $self->{td}->reset_iterator;
88             }
89              
90             1;
91             # ABSTRACT: Serialize references in columns
92              
93             __END__