File Coverage

blib/lib/MooX/Value/ValidationUtils.pm
Criterion Covered Total %
statement 43 43 100.0
branch 28 28 100.0
condition 15 15 100.0
subroutine 10 10 100.0
pod 8 8 100.0
total 104 104 100.0


line stmt bran cond sub pod time code
1             package MooX::Value::ValidationUtils;
2              
3 9     9   51111 use warnings;
  9         13  
  9         240  
4 9     9   33 use strict;
  9         9  
  9         4783  
5              
6             our $VERSION = '0.05';
7              
8             # RFC 1123 and 2181
9             sub why_invalid_domain_name
10             {
11 93     93 1 79 my ($poss_domain) = @_;
12              
13 93 100       152 return ( 'No domain supplied', '', undef ) unless defined $poss_domain;
14 90 100 100     306 return ( 'Domain must be between 1 and 255 octets in length.', '', undef )
15             if !length $poss_domain or length $poss_domain > 255;
16 85         244 my @labels = split( /\./, $poss_domain );
17 85 100       139 return ( __PACKAGE__ . ': At least one label is required', '', undef ) unless @labels;
18              
19             # Final label can be empty
20 83 100       121 my $last = length $labels[0] ? $#labels : $#labels-1;
21 83         152 foreach my $label ( @labels[0 .. $last] )
22             {
23 394         359 my ($why, $long, $data) = why_invalid_domain_label( $label );
24 394 100       554 return ($why, $long, $label) if defined $why;
25             }
26 69         122 return;
27             }
28              
29             sub is_valid_domain_name
30             {
31 34     34 1 6717 my ($poss_domain) = @_;
32 34         56 my ($why) = why_invalid_domain_name( $poss_domain );
33 34         92 return !defined $why;
34             }
35              
36             # RFC 1123 and 2181
37             sub why_invalid_domain_label
38             {
39 435     435 1 322 my ($poss_label) = @_;
40 435 100       501 return ( 'No domain label supplied', '', undef ) unless defined $poss_label;
41 432 100 100     1109 return ( 'Label is not in the length range 1 to 63', '', undef )
42             if !length $poss_label or length $poss_label > 63;
43 419 100       927 return ( 'Label is not the correct form.', '', undef )
44             unless $poss_label =~ m{\A[a-zA-Z0-9] # No hyphens at front
45             (?:[-a-zA-Z0-9]* # hyphens allowed in the middle
46             [a-zA-Z0-9])? # No hyphens at the end
47             \z}x;
48 406         361 return;
49             }
50              
51             sub is_valid_domain_label
52             {
53 16     16 1 3411 my ($poss_label) = @_;
54 16         23 my ($why) = why_invalid_domain_label( $poss_label );
55 16         58 return !defined $why;
56             }
57              
58              
59             # RFC 5322
60             sub why_invalid_email_local_part
61             {
62 220     220 1 241 my ($poss_part) = @_;
63 220 100       384 return ( 'No email local part supplied', '', undef ) unless defined $poss_part;
64 218 100 100     885 return ( 'Local part is not in the length range 1 to 64', '', undef )
65             if !length $poss_part or length $poss_part > 64;
66 214 100 100     1180 return ( 'Local part is not correct form.', '', undef )
67             unless $poss_part =~ m/\A"(?:\\.|[!#-[\]-~])+"\z/ # quoted string (all 7-bit ASCII except \ and " unless quoted)
68             || $poss_part =~ m{\A[a-zA-Z0-9!#\$\%&'*+\-/=?^_`{|}~]+ # any 'atext' characters
69             (?:\. # separated by dots
70             [a-zA-Z0-9!#\$\%&'*+\-/=?^_`{|}~]+ # any 'atext' characters
71             )*
72             \z}x;
73 182         238 return;
74             }
75              
76             sub is_valid_email_local_part
77             {
78 107     107 1 32699 my ($poss_part) = @_;
79 107         147 my ($why) = why_invalid_email_local_part( $poss_part );
80 107         406 return !defined $why;
81             }
82              
83              
84              
85             # RFC 5322
86             sub why_invalid_common_email_local_part
87             {
88 198     198 1 243 my ($poss_part) = @_;
89 198 100       302 return ( 'No email local part supplied', '', undef ) unless defined $poss_part;
90 196 100 100     641 return ( 'Local part is not in the length range 1 to 64', '', undef )
91             if !length $poss_part or length $poss_part > 64;
92 192 100       771 return ( 'Local part is not correct form.', '', undef )
93             unless $poss_part =~ m{\A[a-zA-Z0-9!#\$\%&'*+\-/=?^_`{|}~]+ # any 'atext' characters
94             (?:\. # separated by dots
95             [a-zA-Z0-9!#\$\%&'*+\-/=?^_`{|}~]+ # any 'atext' characters
96             )*
97             \z}x;
98 156         199 return;
99             }
100              
101             sub is_valid_common_email_local_part
102             {
103 96     96 1 28084 my ($poss_part) = @_;
104 96         117 my ($why) = why_invalid_common_email_local_part( $poss_part );
105 96         370 return !defined $why;
106             }
107              
108             1;
109             __END__