File Coverage

blib/lib/Spp/Builtin.pm
Criterion Covered Total %
statement 117 225 52.0
branch 19 64 29.6
condition n/a
subroutine 39 65 60.0
pod 0 53 0.0
total 175 407 43.0


line stmt bran cond sub pod time code
1             package Spp::Builtin;
2              
3 2     2   29 use 5.012;
  2         6  
4 2     2   10 no warnings "experimental";
  2         4  
  2         57  
5              
6 2     2   10 use Exporter;
  2         3  
  2         174  
7             our @ISA = qw(Exporter);
8             our @EXPORT = qw(End In Out True False Qstr Qint Blank
9             clean first string strings sort_array to_json from_json
10             is_exists first_char last_char rest_str tail rest
11             is_string is_int is_array Chop add uuid
12             error read_file write_file len trim subarray
13             is_space is_upper is_lower is_digit is_xdigit
14             is_alpha is_words is_hspace is_vspace
15             start_with end_with to_end get_time change_sufix
16             get_file_mtime is_update tidy_perl find_wanted
17             to_int copy is_false is_true croak
18             estr estr_ints is_str is_bool is_estr is_blank
19             cons cons_atom);
20              
21 2     2   532 use File::Find::Wanted qw(find_wanted);
  2         418  
  2         95  
22 2     2   660 use Time::Piece;
  2         19828  
  2         12  
23 2     2   160 use File::Basename qw(fileparse);
  2         9  
  2         135  
24 2     2   6833 use Perl::Tidy;
  2         292358  
  2         217  
25 2     2   15 use File::Copy qw(copy);
  2         3  
  2         93  
26 2     2   580 use String::Random;
  2         4815  
  2         132  
27 2     2   827 use JSON::XS qw(decode_json encode_json);
  2         6774  
  2         115  
28 2     2   13 use Carp;
  2         4  
  2         146  
29              
30             use constant {
31 2         3500 End => chr(0),
32             In => chr(1),
33             Out => chr(2),
34             True => chr(3),
35             False => chr(4),
36             Qstr => chr(5),
37             Qint => chr(6),
38             Blank => (chr(1) . chr(2)),
39 2     2   11 };
  2         3  
40              
41             sub cons {
42 50     50 0 125 my @args = @_;
43 50         91 my $estr = join '', map { cons_atom($_) } @args;
  114         173  
44 50         223 return (In . $estr . Out);
45             }
46              
47             sub cons_atom {
48 114     114 0 128 my $atom = shift;
49 114 100       147 if (is_estr($atom)) { return $atom }
  69         169  
50 45 50       97 if (is_int($atom)) { return (Qint . $atom) }
  0         0  
51 45 50       91 if ($atom eq '') { error("cons blank Str") }
  0         0  
52 45 50       74 if (is_str($atom)) { return (Qstr . $atom) }
  45         107  
53 0         0 croak("not estr or str or int??");
54             }
55              
56             sub estr {
57 15     15 0 21 my $estr_array = shift;
58 15 50       24 if (is_string($estr_array)) { croak('trace it...') }
  0         0  
59 15         24 return cons(@{$estr_array});
  15         34  
60             }
61              
62             sub estr_ints {
63 14     14 0 25 my $ints = shift;
64 14         27 my @estrs = map { (Qint . $_) } @{$ints};
  28         107  
  14         46  
65 14         64 return In . join('', @estrs) . Out;
66             }
67              
68             sub is_str {
69 1131     1131 0 1417 my $str = shift;
70 1131 50       1530 if (is_string($str)) {
71 1131         1626 my $char = substr($str, 0, 1);
72 1131 100       1867 if (ord($char) > 6) { return 1 }
  124         368  
73             }
74 1007         2041 return 0;
75             }
76              
77             sub is_bool {
78 131     131 0 168 my $char = shift;
79 131 100       200 if (is_false($char)) { return 1 }
  117         267  
80 14 50       47 if (is_true($char)) { return 1 }
  0         0  
81 14         38 return 0;
82             }
83              
84             sub is_estr {
85 169     169 0 187 my $str = shift;
86 169         373 return substr($str, 0, 1) eq In;
87             }
88              
89             sub is_blank {
90 0     0 0 0 my $estr = shift;
91 0         0 return $estr eq Blank;
92             }
93              
94 0     0 0 0 sub error { say @_; exit() }
  0         0  
95              
96             sub to_json {
97 0     0 0 0 my $data = shift;
98 0         0 return encode_json($data);
99             }
100              
101             sub from_json {
102 0     0 0 0 my $data = shift;
103 0         0 return decode_json($data);
104             }
105              
106             sub clean {
107 1699     1699 0 1906 my $stack = shift;
108 1699         1711 @{$stack} = ();
  1699         3512  
109             }
110              
111             sub string {
112 2998     2998 0 3423 my $stack = shift;
113 2998         3176 return join '', @{$stack};
  2998         9759  
114             }
115              
116             sub first {
117 0     0 0 0 my $stack = shift;
118 0 0       0 if (is_array($stack)) {
119 0         0 return $stack->[0];
120             }
121 0         0 croak("Could not first not Array");
122 0         0 return False
123             }
124              
125             sub strings {
126 3     3 0 6 my $stack = shift;
127 3         35 return $stack;
128             }
129              
130             sub sort_array {
131 0     0 0 0 my $array = shift;
132 0         0 return [reverse sort @{$array}];
  0         0  
133             }
134              
135             sub uuid {
136 0     0 0 0 my $gen = String::Random->new;
137 0         0 return $gen->randregex('[A-Z]{5}');
138             }
139              
140             sub is_exists {
141 0     0 0 0 my $file = shift;
142 0         0 return (-e $file);
143             }
144              
145             sub first_char {
146 2     2 0 4 my $data = shift;
147 2 50       5 if (is_string($data)) {
148 2         7 return substr $data, 0, 1;
149             }
150 0         0 croak("could not first No Str");
151 0         0 return True
152             }
153              
154             sub last_char {
155 2     2 0 5 my $str = shift;
156 2 50       6 if (is_string($str)) {
157 2         6 return substr $str, -1;
158             }
159 0         0 croak("Could not last-char Array");
160             }
161              
162             sub rest_str {
163 3     3 0 4 my $data = shift;
164 3 50       9 return substr($data, 1) if is_string($data);
165 0         0 croak("rest_str only could do str");
166             }
167              
168             sub tail {
169 0     0 0 0 my $data = shift;
170 0 0       0 if (is_array($data)) {
171 0         0 return $data->[-1];
172             }
173 0         0 croak("Could not tail not Array");
174             }
175              
176             sub rest {
177 3     3 0 5 my $data = shift;
178 3 50       8 if (is_array($data)) {
179 3         5 my @array = @{$data};
  3         31  
180 3         24 return [splice(@array, 1)];
181             }
182 0         0 croak("rest only could do array");
183             }
184              
185             sub is_string {
186 2216     2216 0 2496 my $x = shift;
187 2216         4456 return (ref($x) eq ref(''));
188             }
189              
190             sub is_int {
191 45     45 0 53 my $int = shift;
192 45         147 return ($int ^ $int) eq '0';
193             }
194              
195             sub is_array {
196 1021     1021 0 1094 my $x = shift;
197 1021         2258 return (ref($x) eq ref([]));
198             }
199              
200             sub Chop {
201 1     1 0 2 my $str = shift;
202 1         4 return substr($str, 0, -1);
203             }
204              
205             sub add {
206 34     34 0 95 my @strs = @_;
207 34         169 return join '', @strs;
208             }
209              
210             sub read_file {
211 0     0 0 0 my $file = shift;
212 0 0       0 error("file: $file not exists") if not(-e $file);
213 0         0 local $/;
214 0 0       0 open my ($fh), '<:encoding(UTF-8)', $file or die $!;
215 0         0 return <$fh>;
216             }
217              
218             sub write_file {
219 0     0 0 0 my ($file, $str) = @_;
220 0 0       0 open my ($fh), '>:encoding(UTF-8)', $file or die $!;
221 0         0 print {$fh} $str;
  0         0  
222             # say "write file: $file ok!";
223 0         0 return $file;
224             }
225              
226             sub len {
227 1063     1063 0 1211 my $data = shift;
228 1063 100       1485 return length($data) if is_string($data);
229 1018 50       1630 return scalar(@{$data}) if is_array($data);
  1018         2267  
230 0         0 croak("len only make array");
231             }
232              
233             sub trim {
234 0     0 0 0 my $str = shift;
235 0 0       0 if (is_string($str)) {
236 0         0 $str =~ s/^\s+|\s+$//g;
237 0         0 return $str;
238             }
239 0         0 croak("trim only make string");
240             }
241              
242             sub subarray {
243 0     0 0 0 my ($array, $from, $to) = @_;
244 0         0 my @array = @{$array};
  0         0  
245 0 0       0 if (is_array($array)) {
246 0 0       0 if ($to > 0) {
247 0         0 my $len = $to - $from + 1;
248 0         0 my $sub_array = [splice @array, $from, $len];
249 0         0 return $sub_array;
250             }
251 0 0       0 if (defined $to) {
252 0         0 return [splice @array, $from, $to];
253             }
254 0         0 return [splice @array, $from];
255             }
256 0         0 croak("subarray only could process array");
257             }
258              
259             sub is_space {
260 34     34 0 47 my $r = shift;
261 34         147 return $r ~~ ["\n", "\t", "\r", ' '];
262             }
263              
264             sub is_upper {
265 2     2 0 3 my $r = shift;
266 2         36 return $r ~~ ['A' .. 'Z'];
267             }
268              
269             sub is_lower {
270 2     2 0 3 my $r = shift;
271 2         39 return $r ~~ ['a' .. 'z'];
272             }
273              
274             sub is_digit {
275 1110     1110 0 1338 my $r = shift;
276 1110         5862 return $r ~~ ['0' .. '9'];
277             }
278              
279             sub is_xdigit {
280 0     0 0 0 my $char = shift;
281 0 0       0 return 1 if is_digit($char);
282 0 0       0 return 1 if $char ~~ ['a' .. 'f'];
283 0 0       0 return 1 if $char ~~ ['A' .. 'F'];
284 0         0 return 0;
285             }
286              
287             sub is_alpha {
288 34     34 0 55 my $r = shift;
289 34         553 return $r ~~ ['a' .. 'z', 'A' .. 'Z', '_'];
290             }
291              
292             sub is_words {
293 0     0 0 0 my $r = shift;
294 0 0       0 return 1 if is_digit($r);
295 0 0       0 return 1 if is_alpha($r);
296 0         0 return 0;
297             }
298              
299             sub is_hspace {
300 0     0 0 0 my $h = shift;
301 0         0 return $h ~~ [' ', "\t"];
302             }
303              
304             sub is_vspace {
305 0     0 0 0 my $v = shift;
306 0         0 return $v ~~ ["\r", "\n"];
307             }
308              
309             sub start_with {
310 0     0 0 0 my ($str, $start) = @_;
311 0 0       0 return 1 if index($str, $start) == 0;
312 0         0 return 0;
313             }
314              
315             sub end_with {
316 0     0 0 0 my ($str, $end) = @_;
317 0         0 my $len = length($end);
318 0         0 return substr($str, -$len) eq $end;
319             }
320              
321             sub to_end {
322 0     0 0 0 my $str = shift;
323 0         0 my $index = index($str, "\n");
324 0         0 return substr($str, 0, $index);
325             }
326              
327             sub get_time {
328 0     0 0 0 my $t = localtime;
329 0         0 return $t->hms('-');
330             }
331              
332             sub change_sufix {
333 0     0 0 0 my ($file, $from_sufix, $to_sufix) = @_;
334 0         0 my @sufix = ($from_sufix);
335 0         0 my ($name, $path) = fileparse($file, @sufix);
336 0         0 return $path . $name . $to_sufix;
337             }
338              
339             sub get_file_mtime {
340 0     0 0 0 my $file = shift;
341 0 0       0 if (not(-e $file)) {
342 0         0 say "$file is not exists!";
343             }
344             else {
345 0         0 return (stat($file))[9];
346             }
347             }
348              
349             sub is_update {
350 0     0 0 0 my ($file, $to_file) = @_;
351 0         0 my $file_mtime = get_file_mtime($file);
352 0         0 my $to_file_mtime = get_file_mtime($to_file);
353 0         0 return ($file_mtime < $to_file_mtime);
354             }
355              
356             sub to_int {
357 0     0 0 0 my $str = shift;
358 0         0 return 0 + $str;
359             }
360              
361             sub is_false {
362 672     672 0 788 my $char = shift;
363 672         1352 return $char eq False;
364             }
365              
366             sub is_true {
367 167     167 0 196 my $char = shift;
368 167         368 return $char eq True;
369             }
370              
371             sub tidy_perl {
372 0     0 0   my $source_string = shift;
373 0           my $dest_string;
374             my $stderr_string;
375 0           my $errorfile_string;
376 0           my $argv = "-i=2 -l=60 -vt=2 -pt=2 -bt=1 -sbt=2 -bbt=1";
377 0           my $error = Perl::Tidy::perltidy(
378             argv => $argv,
379             source => \$source_string,
380             destination => \$dest_string,
381             stderr => \$stderr_string,
382             errorfile => \$errorfile_string,
383             );
384              
385 0 0         if ($error) {
386 0           print "<<STDERR>>\n$stderr_string\n";
387             }
388 0           return $dest_string;
389             }
390              
391             1;