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 29     29   720673 use strict;
  29         62  
  29         1073  
6 29     29   136 use warnings;
  29         80  
  29         1757  
7             our $VERSION = '2.20260216'; # VERSION
8 29     29   165 use Carp;
  29         57  
  29         2078  
9              
10 29     29   13860 use Mail::AuthenticationResults::Header::AuthServID;
  29         95  
  29         1303  
11              
12 29     29   179 use base 'Mail::AuthenticationResults::Header::Base';
  29         51  
  29         48947  
13              
14              
15 300     300   3224 sub _HAS_VALUE{ return 1; }
16 441     441   1012 sub _HAS_CHILDREN{ return 1; }
17              
18             sub _ALLOWED_CHILDREN {
19 255     255   412 my ( $self, $child ) = @_;
20 255 100       519 return 1 if ref $child eq 'Mail::AuthenticationResults::Header::Comment';
21 244 100       756 return 1 if ref $child eq 'Mail::AuthenticationResults::Header::Entry';
22 6         51 return 0;
23             }
24              
25              
26             sub set_indent_by {
27 8     8 1 23 my ( $self, $value ) = @_;
28 8         22 $self->{ 'indent_by' } = $value;
29 8         18 return $self;
30             }
31              
32              
33             sub indent_by {
34 325     325 1 616 my ( $self ) = @_;
35 325 100       1020 return 4 if ! defined $self->{ 'indent_by' }; #5.8
36 141         370 return $self->{ 'indent_by'};
37             }
38              
39              
40             sub set_indent_on {
41 13     13 1 29 my ( $self, $type ) = @_;
42 13         37 $self->{ 'indent_type_' . $type } = 1;
43 13         23 return $self;
44             }
45              
46              
47             sub clear_indent_on {
48 20     20 1 56 my ( $self, $type ) = @_;
49 20         81 $self->{ 'indent_type_' . $type } = 0;
50 20         40 return $self;
51             }
52              
53              
54             sub indent_on {
55 292     292 1 747 my ( $self, $type ) = @_;
56 292 100       761 if ( $type eq 'Mail::AuthenticationResults::Header::Entry' ) {
57 92 100       361 return 1 if ! defined $self->{ 'indent_type_' . $type }; #5.8
58 56         224 return $self->{ 'indent_type_' . $type };
59             }
60 200 100       595 if ( $type eq 'Mail::AuthenticationResults::Header::SubEntry' ) {
    100          
61 119 100       474 return 0 if ! defined $self->{ 'indent_type_' . $type }; #5.8
62 75         326 return $self->{ 'indent_type_' . $type };
63             }
64             elsif ( $type eq 'Mail::AuthenticationResults::Header::Comment' ) {
65 80 100       311 return 0 if ! defined $self->{ 'indent_type_' . $type }; #5.8
66 34         119 return $self->{ 'indent_type_' . $type };
67             }
68 1         4 return 0;
69             }
70              
71              
72             sub set_eol {
73 3     3 1 61 my ( $self, $eol ) = @_;
74 3 100       22 if ( $eol =~ /^\r?\n$/ ) {
75 2         5 $self->{ 'eol' } = $eol;
76             }
77             else {
78 1         20 croak 'Invalid eol string';
79             }
80 2         6 return $self;
81             }
82              
83              
84             sub eol {
85 325     325 1 549 my ( $self ) = @_;
86 325 100       1259 return "\n" if ! defined $self->{ 'eol' }; #5.8
87 14         71 return $self->{ 'eol' };
88             }
89              
90              
91             sub fold_at {
92 38     38 1 91 my ( $self ) = @_;
93 38         180 return $self->{ 'fold_at' };
94             }
95              
96              
97             sub set_fold_at {
98 4     4 1 71 my ( $self, $fold_at ) = @_;
99 4         11 $self->{ 'fold_at' } = $fold_at;
100 4         14 return $self;
101             }
102              
103              
104             sub force_fold_at {
105 35     35 1 76 my ( $self ) = @_;
106 35         146 return $self->{ 'force_fold_at' };
107             }
108              
109              
110             sub set_force_fold_at {
111 1     1 1 46 my ( $self, $fold_at ) = @_;
112 1         3 $self->{ 'force_fold_at' } = $fold_at;
113 1         5 return $self;
114             }
115              
116              
117             sub set_indent_style {
118 12     12 1 180 my ( $self, $style ) = @_;
119              
120 12 100       70 if ( $style eq 'none' ) {
    100          
    100          
    100          
121 3         17 $self->clear_indent_on( 'Mail::AuthenticationResults::Header::Entry' );
122 3         9 $self->clear_indent_on( 'Mail::AuthenticationResults::Header::SubEntry' );
123 3         6 $self->clear_indent_on( 'Mail::AuthenticationResults::Header::Comment' );
124             }
125             elsif ( $style eq 'entry' ) {
126 5         25 $self->set_indent_by( 4 );
127 5         20 $self->set_indent_on( 'Mail::AuthenticationResults::Header::Entry' );
128 5         21 $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         6 $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         3 $self->clear_indent_on( 'Mail::AuthenticationResults::Header::Comment' );
136             }
137             elsif ( $style eq 'full' ) {
138 2         9 $self->set_indent_by( 4 );
139 2         8 $self->set_indent_on( 'Mail::AuthenticationResults::Header::Entry' );
140 2         6 $self->set_indent_on( 'Mail::AuthenticationResults::Header::SubEntry' );
141 2         5 $self->set_indent_on( 'Mail::AuthenticationResults::Header::Comment' );
142             }
143             else {
144 1         21 croak "Unknown indent style $style";
145             }
146              
147 11         57 return $self;
148             }
149              
150             sub safe_set_value {
151 5     5 1 714 my ( $self, $value ) = @_;
152 5         15 $self->set_value( $value );
153 3         9 return $self;
154             }
155              
156             sub set_value {
157 60     60 1 943 my ( $self, $value ) = @_;
158 60 50       216 croak 'Does not have value' if ! $self->_HAS_VALUE(); # uncoverable branch true
159             # HAS_VALUE is 1 for this class
160 60 100       197 croak 'Value cannot be undefined' if ! defined $value;
161 58 100       214 croak 'value should be an AuthServID type' if ref $value ne 'Mail::AuthenticationResults::Header::AuthServID';
162 56         212 $self->{ 'value' } = $value;
163 56         195 return $self;
164             }
165              
166             sub add_parent {
167 20     20 1 29 my ( $self, $parent ) = @_;
168 20         23 return;
169             }
170              
171             sub add_child {
172 132     132 1 6076 my ( $self, $child ) = @_;
173 132 100       381 croak 'Cannot add a SubEntry as a child of a Header' if ref $child eq 'Mail::AuthenticationResults::Header::SubEntry';
174 130         472 return $self->SUPER::add_child( $child );
175             }
176              
177             sub _as_hashref {
178 2     2   7 my ( $self ) = @_;
179              
180 2         8 my $type = lc ref $self;
181 2         18 $type =~ s/^(.*::)//;
182 2         10 my $hashref = { 'type' => $type };
183              
184 2 50       15 $hashref->{'key'} = $self->key() if $self->_HAS_KEY();
185 2 50       15 $hashref->{'authserv_id'} = $self->value()->_as_hashref() if $self->value();
186 2 50       8 if ( $self->_HAS_CHILDREN() ) {
187 2         5 my @children = map { $_->_as_hashref() } @{ $self->children() };
  16         139  
  2         48  
188 2         8 $hashref->{'children'} = \@children;
189             }
190 2         199 return $hashref;
191             }
192              
193             sub as_string {
194 33     33 1 6490 my ( $self ) = @_;
195 33         230 my $header = Mail::AuthenticationResults::FoldableHeader->new();
196 33 100       167 $header->set_try_fold_at( $self->fold_at() ) if defined $self->fold_at();
197 33 50       119 $header->set_force_fold_at( $self->force_fold_at() ) if defined $self->force_fold_at();
198 33         97 $header->set_eol( $self->eol() );
199 33         133 $header->set_indent( ' ' x $self->indent_by() );
200 33         164 $header->set_sub_indent( ' ' );
201 33         119 $self->build_string( $header );
202 33         167 return $header->as_string();
203             }
204              
205             sub build_string {
206 35     35 1 154 my ( $self, $header ) = @_;
207 35         69 my $value = q{};
208 35 100       157 if ( $self->value() ) {
209 32         133 $self->value()->build_string( $header );
210             }
211             else {
212 3         14 $header->string( 'unknown' );
213             }
214 35         157 $header->separator( ';' );
215              
216 35         56 my $sep = 0;
217 35         74 foreach my $child ( @{ $self->children() } ) {
  35         232  
218 95 100       374 $header->separator( ';' ) if $sep;
219 95         176 $sep = 1;
220 95         380 $child->as_string_prefix( $header );
221 95         340 $child->build_string( $header );
222             }
223              
224 35 100       68 if ( scalar @{ $self->search({ 'isa' => 'entry' } )->children() } == 0 ) {
  35         257  
225             #if ( scalar @{ $self->children() } > 0 ) {
226             # $value .= ' ';
227             #}
228 13         81 $header->space( ' ' );
229 13         28 $header->string ( 'none' );
230             }
231              
232 35         151 return;
233             }
234              
235             1;
236              
237             __END__