File Coverage

blib/lib/GDPR/IAB/TCFv2/BitField.pm
Criterion Covered Total %
statement 53 53 100.0
branch 15 22 68.1
condition n/a
subroutine 10 10 100.0
pod 3 4 75.0
total 81 89 91.0


line stmt bran cond sub pod time code
1             package GDPR::IAB::TCFv2::BitField;
2 5     5   1819 use strict;
  5         24  
  5         243  
3 5     5   29 use warnings;
  5         10  
  5         396  
4 5     5   31 use integer;
  5         12  
  5         37  
5 5     5   178 use bytes;
  5         11  
  5         37  
6              
7 5     5   2581 use GDPR::IAB::TCFv2::BitUtils qw;
  5         19  
  5         579  
8 5     5   40 use Carp qw;
  5         11  
  5         3996  
9              
10             sub Parse {
11 39     39 0 213 my ( $klass, %args ) = @_;
12              
13 39 50       122 croak "missing 'data'" unless defined $args{data};
14 39 50       108 croak "missing 'data_size'" unless defined $args{data_size};
15             croak "missing 'max_id'"
16 39 50       127 unless defined $args{max_id};
17              
18 39 50       106 croak "missing 'options'" unless defined $args{options};
19 39 50       106 croak "missing 'options.json'" unless defined $args{options}->{json};
20              
21 39         76 my $data = $args{data};
22 39         59 my $data_size = $args{data_size};
23 39         65 my $offset = 0;
24 39         65 my $max_id = $args{max_id};
25 39         60 my $options = $args{options};
26              
27             # add 7 to force rounding to next integer value
28 39         82 my $bytes_required = ( $max_id + 7 ) / 8;
29              
30 39 50       95 croak
31             "a BitField for $max_id requires a consent string of $bytes_required bytes. This consent string had $data_size"
32             if $data_size < $bytes_required;
33              
34 39         186 my $self = {
35             data => substr( $data, $offset, $max_id ),
36             max_id => $max_id,
37             options => $options,
38             };
39              
40 39         87 bless $self, $klass;
41              
42 39         159 return ( $self, $offset + $max_id );
43             }
44              
45             sub max_id {
46 2     2 1 4 my $self = shift;
47              
48 2         17 return $self->{max_id};
49             }
50              
51             sub contains {
52 242     242 1 557 my ( $self, $id ) = @_;
53              
54 242 50       765 croak "invalid vendor id $id: must be positive integer bigger than 0"
55             if $id < 1;
56              
57 242 100       718 return if $id > $self->{max_id};
58              
59 230         1048 return is_set( $self->{data}, $id - 1 );
60             }
61              
62             sub TO_JSON {
63 24     24 1 44 my $self = shift;
64              
65 24         273 my @data = split //, $self->{data};
66              
67 24 100       69 if ( !!$self->{options}->{json}->{compact} ) {
68 20         79 return [ grep { $data[ $_ - 1 ] } 1 .. $self->{max_id} ];
  1032         1792  
69             }
70              
71 4         8 my ( $false, $true ) = @{ $self->{options}->{json}->{boolean_values} };
  4         12  
72              
73 4 100       15 if ( !!$self->{options}->{json}->{verbose} ) {
74 228 100       622 return { map { $_ => $data[ $_ - 1 ] ? $true : $false }
75 2         40 1 .. $self->{max_id} };
76             }
77              
78             return {
79 68         209 map { $_ => $true }
80 228         384 grep { $data[ $_ - 1 ] } 1 .. $self->{max_id}
81 2         38 };
82             }
83              
84             1;
85             __END__