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