File Coverage

blib/lib/Error/Pure/Output/Text.pm
Criterion Covered Total %
statement 101 101 100.0
branch 20 20 100.0
condition n/a
subroutine 15 15 100.0
pod 6 6 100.0
total 142 142 100.0


line stmt bran cond sub pod time code
1             package Error::Pure::Output::Text;
2              
3 8     8   202487 use base qw(Exporter);
  8         18  
  8         1401  
4 8     8   57 use strict;
  8         14  
  8         317  
5 8     8   45 use warnings;
  8         10567  
  8         642  
6              
7 8     8   5407 use Readonly;
  8         41123  
  8         11937  
8              
9             # Constants.
10             Readonly::Array our @EXPORT_OK => qw(err_bt_pretty err_bt_pretty_rev err_line
11             err_line_all err_print err_print_var);
12             Readonly::Scalar our $EMPTY_STR => q{};
13             Readonly::Scalar our $SPACE => q{ };
14              
15             # Version.
16             our $VERSION = 0.24;
17              
18             # Pretty print of backtrace.
19             sub err_bt_pretty {
20 6     6 1 277995 my @errors = @_;
21              
22 6         31 my @ret;
23 6         16 my $l_ar = _lenghts(@errors);
24 6         9 foreach my $error_hr (@errors) {
25 7         19 push @ret, _bt_pretty_one($error_hr, $l_ar);
26             }
27              
28 6 100       35 return wantarray ? @ret : (join "\n", @ret)."\n";
29             }
30              
31             # Reverse pretty print of backtrace.
32             sub err_bt_pretty_rev {
33 5     5 1 374208 my @errors = @_;
34              
35 5         11 my @ret;
36 5         16 my $l_ar = _lenghts(@errors);
37 5         11 foreach my $error_hr (reverse @errors) {
38 6         19 push @ret, _bt_pretty_one($error_hr, $l_ar);
39             }
40              
41 5 100       42 return wantarray ? @ret : (join "\n", @ret)."\n";
42             }
43              
44             # Pretty print line error.
45             sub err_line {
46 3     3 1 328571 my @errors = @_;
47              
48 3         13 return _err_line($errors[-1]);
49             }
50              
51             # Pretty print with errors each on one line.
52             sub err_line_all {
53 3     3 1 283302 my @errors = @_;
54              
55 3         6 my $ret;
56 3         9 foreach my $error_hr (@errors) {
57 4         12 $ret .= _err_line($error_hr);
58             }
59              
60 3         10 return $ret;
61             }
62              
63             # Print error.
64             sub err_print {
65 6     6 1 397899 my @errors = @_;
66              
67 6         21 my $class = _err_class($errors[-1]);
68              
69 6         32 return $class.$errors[-1]->{'msg'}->[0];
70             }
71              
72             # Print error with all variables.
73             sub err_print_var {
74 7     7 1 386225 my @errors = @_;
75              
76 7         15 my @msg = @{$errors[-1]->{'msg'}};
  7         23  
77 7         22 my $class = _err_class($errors[-1]);
78 7         22 my @ret = ($class.(shift @msg));
79 7         23 push @ret, _err_variables(@msg);
80              
81 7 100       39 return wantarray ? @ret : (join "\n", @ret)."\n";
82             }
83              
84             # Pretty print one error backtrace helper.
85             sub _bt_pretty_one {
86 13     13   31 my ($error_hr, $l_ar) = @_;
87              
88 13         15 my @msg = @{$error_hr->{'msg'}};
  13         37  
89 13         34 my @ret = ('ERROR: '.(shift @msg));
90 13         31 push @ret, _err_variables(@msg);
91 13         23 foreach my $i (0 .. $#{$error_hr->{'stack'}}) {
  13         38  
92 19         46 my $st = $error_hr->{'stack'}->[$i];
93 19         36 my $ret = $st->{'class'};
94 19         53 $ret .= $SPACE x ($l_ar->[0] - length $st->{'class'});
95 19         36 $ret .= $st->{'sub'};
96 19         39 $ret .= $SPACE x ($l_ar->[1] - length $st->{'sub'});
97 19         37 $ret .= $st->{'prog'};
98 19         42 $ret .= $SPACE x ($l_ar->[2] - length $st->{'prog'});
99 19         33 $ret .= $st->{'line'};
100 19         43 push @ret, $ret;
101             }
102              
103 13         54 return @ret;
104             }
105              
106             # Print class if class isn't main.
107             sub _err_class {
108 13     13   52 my $error_hr = shift;
109              
110 13         36 my $class = $error_hr->{'stack'}->[0]->{'class'};
111 13 100       49 if ($class eq 'main') {
112 11         26 $class = $EMPTY_STR;
113             }
114 13 100       36 if ($class) {
115 2         6 $class .= ': ';
116             }
117              
118 13         33 return $class;
119             }
120              
121             # Pretty print line error.
122             sub _err_line {
123 7     7   15 my $error_hr = shift;
124              
125 7         16 my $stack_ar = $error_hr->{'stack'};
126 7         15 my $msg = $error_hr->{'msg'};
127 7         19 my $prog = $stack_ar->[0]->{'prog'};
128 7         41 $prog =~ s/^\.\///gms;
129 7         16 my $e = $msg->[0];
130 7         16 chomp $e;
131              
132 7         40 return "#Error [$prog:$stack_ar->[0]->{'line'}] $e\n";
133             }
134              
135             # Process variables.
136             sub _err_variables {
137 20     20   47 my @msg = @_;
138              
139 20         29 my @ret;
140 20         57 while (@msg) {
141 14         28 my $f = shift @msg;
142 14         23 my $t = shift @msg;
143              
144 14 100       39 if (! defined $f) {
145 2         6 last;
146             }
147 12         19 my $ret = $f;
148 12 100       28 if (defined $t) {
149 9         23 chomp $t;
150 9         18 $ret .= ': '.$t;
151             }
152 12         32 push @ret, $ret;
153             }
154              
155 20         49 return @ret;
156             }
157              
158             # Gets length for errors.
159             sub _lenghts {
160 11     11   22 my @errors = @_;
161              
162 11         26 my $l_ar = [0, 0, 0];
163 11         28 foreach my $error_hr (@errors) {
164 13         18 foreach my $st (@{$error_hr->{'stack'}}) {
  13         35  
165 19 100       61 if (length $st->{'class'} > $l_ar->[0]) {
166 11         20 $l_ar->[0] = length $st->{'class'};
167             }
168 19 100       44 if (length $st->{'sub'} > $l_ar->[1]) {
169 15         26 $l_ar->[1] = length $st->{'sub'};
170             }
171 19 100       49 if (length $st->{'prog'} > $l_ar->[2]) {
172 11         22 $l_ar->[2] = length $st->{'prog'};
173             }
174             }
175             }
176 11         22 $l_ar->[0] += 2;
177 11         19 $l_ar->[1] += 2;
178 11         18 $l_ar->[2] += 2;
179              
180 11         26 return $l_ar;
181             }
182              
183             1;
184              
185             __END__