File Coverage

lib/Mail/AuthenticationResults/Header.pm
Criterion Covered Total %
statement 133 133 100.0
branch 49 54 92.5
condition n/a
subroutine 27 27 100.0
pod 18 18 100.0
total 227 232 98.2


line stmt bran cond sub pod time code
1             package Mail::AuthenticationResults::Header;
2             # ABSTRACT: Class modelling the Entire Authentication Results Header set
3              
4             require 5.008;
5 27     27   282282 use strict;
  27         81  
  27         745  
6 27     27   130 use warnings;
  27         45  
  27         944  
7             our $VERSION = '2.20210915'; # VERSION
8 27     27   137 use Carp;
  27         46  
  27         1342  
9              
10 27     27   9758 use Mail::AuthenticationResults::Header::AuthServID;
  27         77  
  27         1040  
11              
12 27     27   161 use base 'Mail::AuthenticationResults::Header::Base';
  27         47  
  27         39719  
13              
14              
15 287     287   2723 sub _HAS_VALUE{ return 1; }
16 399     399   867 sub _HAS_CHILDREN{ return 1; }
17              
18             sub _ALLOWED_CHILDREN {
19 213     213   323 my ( $self, $child ) = @_;
20 213 100       410 return 1 if ref $child eq 'Mail::AuthenticationResults::Header::Comment';
21 204 100       604 return 1 if ref $child eq 'Mail::AuthenticationResults::Header::Entry';
22 6         60 return 0;
23             }
24              
25              
26             sub set_indent_by {
27 7     7 1 19 my ( $self, $value ) = @_;
28 7         17 $self->{ 'indent_by' } = $value;
29 7         14 return $self;
30             }
31              
32              
33             sub indent_by {
34 259     259 1 420 my ( $self ) = @_;
35 259 100       703 return 4 if ! defined $self->{ 'indent_by' }; #5.8
36 114         226 return $self->{ 'indent_by'};
37             }
38              
39              
40             sub set_indent_on {
41 10     10 1 26 my ( $self, $type ) = @_;
42 10         31 $self->{ 'indent_type_' . $type } = 1;
43 10         18 return $self;
44             }
45              
46              
47             sub clear_indent_on {
48 20     20 1 41 my ( $self, $type ) = @_;
49 20         45 $self->{ 'indent_type_' . $type } = 0;
50 20         30 return $self;
51             }
52              
53              
54             sub indent_on {
55 230     230 1 438 my ( $self, $type ) = @_;
56 230 100       434 if ( $type eq 'Mail::AuthenticationResults::Header::Entry' ) {
57 69 100       261 return 1 if ! defined $self->{ 'indent_type_' . $type }; #5.8
58 43         134 return $self->{ 'indent_type_' . $type };
59             }
60 161 100       413 if ( $type eq 'Mail::AuthenticationResults::Header::SubEntry' ) {
    100          
61 98 100       300 return 0 if ! defined $self->{ 'indent_type_' . $type }; #5.8
62 67         184 return $self->{ 'indent_type_' . $type };
63             }
64             elsif ( $type eq 'Mail::AuthenticationResults::Header::Comment' ) {
65 62 100       227 return 0 if ! defined $self->{ 'indent_type_' . $type }; #5.8
66 28         95 return $self->{ 'indent_type_' . $type };
67             }
68 1         3 return 0;
69             }
70              
71              
72             sub set_eol {
73 3     3 1 47 my ( $self, $eol ) = @_;
74 3 100       18 if ( $eol =~ /^\r?\n$/ ) {
75 2         6 $self->{ 'eol' } = $eol;
76             }
77             else {
78 1         17 croak 'Invalid eol string';
79             }
80 2         28 return $self;
81             }
82              
83              
84             sub eol {
85 259     259 1 442 my ( $self ) = @_;
86 259 100       732 return "\n" if ! defined $self->{ 'eol' }; #5.8
87 14         56 return $self->{ 'eol' };
88             }
89              
90              
91             sub fold_at {
92 34     34 1 71 my ( $self ) = @_;
93 34         191 return $self->{ 'fold_at' };
94             }
95              
96              
97             sub set_fold_at {
98 4     4 1 57 my ( $self, $fold_at ) = @_;
99 4         8 $self->{ 'fold_at' } = $fold_at;
100 4         9 return $self;
101             }
102              
103              
104             sub force_fold_at {
105 31     31 1 57 my ( $self ) = @_;
106 31         125 return $self->{ 'force_fold_at' };
107             }
108              
109              
110             sub set_force_fold_at {
111 1     1 1 40 my ( $self, $fold_at ) = @_;
112 1         3 $self->{ 'force_fold_at' } = $fold_at;
113 1         4 return $self;
114             }
115              
116              
117             sub set_indent_style {
118 11     11 1 109 my ( $self, $style ) = @_;
119              
120 11 100       66 if ( $style eq 'none' ) {
    100          
    100          
    100          
121 3         14 $self->clear_indent_on( 'Mail::AuthenticationResults::Header::Entry' );
122 3         19 $self->clear_indent_on( 'Mail::AuthenticationResults::Header::SubEntry' );
123 3         17 $self->clear_indent_on( 'Mail::AuthenticationResults::Header::Comment' );
124             }
125             elsif ( $style eq 'entry' ) {
126 5         18 $self->set_indent_by( 4 );
127 5         29 $self->set_indent_on( 'Mail::AuthenticationResults::Header::Entry' );
128 5         17 $self->clear_indent_on( 'Mail::AuthenticationResults::Header::SubEntry' );
129 5         12 $self->clear_indent_on( 'Mail::AuthenticationResults::Header::Comment' );
130             }
131             elsif ( $style eq 'subentry' ) {
132 1         7 $self->set_indent_by( 4 );
133 1         4 $self->set_indent_on( 'Mail::AuthenticationResults::Header::Entry' );
134 1         3 $self->set_indent_on( 'Mail::AuthenticationResults::Header::SubEntry' );
135 1         4 $self->clear_indent_on( 'Mail::AuthenticationResults::Header::Comment' );
136             }
137             elsif ( $style eq 'full' ) {
138 1         7 $self->set_indent_by( 4 );
139 1         6 $self->set_indent_on( 'Mail::AuthenticationResults::Header::Entry' );
140 1         4 $self->set_indent_on( 'Mail::AuthenticationResults::Header::SubEntry' );
141 1         3 $self->set_indent_on( 'Mail::AuthenticationResults::Header::Comment' );
142             }
143             else {
144 1         22 croak "Unknown indent style $style";
145             }
146              
147 10         32 return $self;
148             }
149              
150             sub safe_set_value {
151 5     5 1 797 my ( $self, $value ) = @_;
152 5         16 $self->set_value( $value );
153 3         10 return $self;
154             }
155              
156             sub set_value {
157 58     58 1 810 my ( $self, $value ) = @_;
158 58 50       221 croak 'Does not have value' if ! $self->_HAS_VALUE(); # uncoverable branch true
159             # HAS_VALUE is 1 for this class
160 58 100       155 croak 'Value cannot be undefined' if ! defined $value;
161 56 100       186 croak 'value should be an AuthServID type' if ref $value ne 'Mail::AuthenticationResults::Header::AuthServID';
162 54         168 $self->{ 'value' } = $value;
163 54         158 return $self;
164             }
165              
166             sub add_parent {
167 20     20 1 35 my ( $self, $parent ) = @_;
168 20         31 return;
169             }
170              
171             sub add_child {
172 110     110 1 6527 my ( $self, $child ) = @_;
173 110 100       307 croak 'Cannot add a SubEntry as a child of a Header' if ref $child eq 'Mail::AuthenticationResults::Header::SubEntry';
174 109         382 return $self->SUPER::add_child( $child );
175             }
176              
177             sub _as_hashref {
178 1     1   2 my ( $self ) = @_;
179              
180 1         5 my $type = lc ref $self;
181 1         8 $type =~ s/^(.*::)//;
182 1         3 my $hashref = { 'type' => $type };
183              
184 1 50       6 $hashref->{'key'} = $self->key() if $self->_HAS_KEY();
185 1 50       5 $hashref->{'authserv_id'} = $self->value()->_as_hashref() if $self->value();
186 1 50       3 if ( $self->_HAS_CHILDREN() ) {
187 1         2 my @children = map { $_->_as_hashref() } @{ $self->children() };
  8         17  
  1         5  
188 1         3 $hashref->{'children'} = \@children;
189             }
190 1         61 return $hashref;
191             }
192              
193             sub as_string {
194 29     29 1 2673 my ( $self ) = @_;
195 29         155 my $header = Mail::AuthenticationResults::FoldableHeader->new();
196 29 100       107 $header->set_try_fold_at( $self->fold_at() ) if defined $self->fold_at();
197 29 50       88 $header->set_force_fold_at( $self->force_fold_at() ) if defined $self->force_fold_at();
198 29         93 $header->set_eol( $self->eol() );
199 29         95 $header->set_indent( ' ' x $self->indent_by() );
200 29         106 $header->set_sub_indent( ' ' );
201 29         90 $self->build_string( $header );
202 29         148 return $header->as_string();
203             }
204              
205             sub build_string {
206 31     31 1 65 my ( $self, $header ) = @_;
207 31         61 my $value = q{};
208 31 100       138 if ( $self->value() ) {
209 30         87 $self->value()->build_string( $header );
210             }
211             else {
212 1         5 $header->string( 'unknown' );
213             }
214 31         122 $header->separator( ';' );
215              
216 31         49 my $sep = 0;
217 31         53 foreach my $child ( @{ $self->children() } ) {
  31         144  
218 71 100       257 $header->separator( ';' ) if $sep;
219 71         99 $sep = 1;
220 71         235 $child->as_string_prefix( $header );
221 71         197 $child->build_string( $header );
222             }
223              
224 31 100       56 if ( scalar @{ $self->search({ 'isa' => 'entry' } )->children() } == 0 ) {
  31         196  
225             #if ( scalar @{ $self->children() } > 0 ) {
226             # $value .= ' ';
227             #}
228 13         87 $header->space( ' ' );
229 13         30 $header->string ( 'none' );
230             }
231              
232 31         117 return;
233             }
234              
235             1;
236              
237             __END__