File Coverage

blib/lib/AnyEvent/FTP/Client/Role/RequestBuffer.pm
Criterion Covered Total %
statement 72 76 94.7
branch 20 22 90.9
condition 5 8 62.5
subroutine 10 10 100.0
pod 0 4 0.0
total 107 120 89.1


line stmt bran cond sub pod time code
1             package AnyEvent::FTP::Client::Role::RequestBuffer;
2              
3 24     24   13899 use strict;
  24         109  
  24         815  
4 24     24   135 use warnings;
  24         55  
  24         704  
5 24     24   451 use 5.010;
  24         88  
6 24     24   166 use Moo::Role;
  24         68  
  24         189  
7 24     24   9159 use AnyEvent;
  24         80  
  24         18477  
8              
9             # ABSTRACT: Request buffer role for asynchronous ftp client
10             our $VERSION = '0.18'; # VERSION
11              
12              
13             has request_buffer => (
14             is => 'ro',
15             default => sub { [] },
16             );
17              
18             sub push_command
19             {
20 500     500 0 1870 my $cv;
21              
22 500 100       1809 $cv = pop if (ref $_[-1]) eq 'AnyEvent::CondVar';
23 500   66     12166 $cv //= AnyEvent->condvar;
24              
25 500         4554 my($self, @commands) = @_;
26              
27 500         842 push @{ $self->request_buffer }, { cmd => \@commands, cv => $cv };
  500         2500  
28              
29 500         1679 $self->pop_command;
30              
31 500         2983 $cv;
32             }
33              
34             sub unshift_command
35             {
36 31     31 0 81 my $cv;
37              
38 31 50       199 $cv = pop if (ref $_[-1]) eq 'AnyEvent::CondVar';
39 31   33     173 $cv //= AnyEvent->condvar;
40              
41 31         115 my($self, @commands) = @_;
42              
43 31         71 unshift @{ $self->request_buffer }, { cmd => \@commands, cv => $cv };
  31         233  
44              
45 31         174 $self->pop_command;
46              
47 31         361 $cv;
48             }
49              
50             sub pop_command
51             {
52 1243     1243 0 2588 my($self) = @_;
53              
54 1243   100     3466 $self->{ready} //= 1;
55              
56 1243 100       3115 return $self unless defined $self->{handle};
57              
58 1240 100       2020 unless(@{ $self->request_buffer } > 0)
  1240         3767  
59             {
60 565         999 $self->{ready} = 1;
61 565         3303 return $self;
62             }
63              
64 675 100       1721 return unless $self->{ready};
65              
66 674         1146 my($cmd, $args, $cb) = @{ shift @{ $self->request_buffer->[0]->{cmd} } };
  674         1008  
  674         2681  
67 674 100       2548 my $line = defined $args ? join(' ', $cmd, $args) : $cmd;
68              
69 674         1175 my $handler;
70             $handler = sub {
71 744     744   1454 my $res = shift;
72 744 100       2040 if(defined $cb)
73             {
74 47         178 my $error = $cb->($res);
75 47 50       255 if(defined $error)
76             {
77 0         0 my $batch = shift @{ $self->request_buffer };
  0         0  
78 0         0 $batch->{cv}->croak($error);
79 0         0 return;
80             }
81             }
82 744 100       2387 if($res->is_preliminary)
83             {
84 70         317 $self->on_next_response($handler);
85             }
86             else
87             {
88 674         1497 $self->{ready} = 1;
89 674 100       1830 if($res->is_success)
90             {
91 591 100       1055 if(@{ $self->request_buffer->[0]->{cmd} } > 0)
  591         2738  
92             {
93 143         440 $self->pop_command;
94             }
95             else
96             {
97 448         784 my $batch = shift @{ $self->request_buffer };
  448         1048  
98 448         2329 $batch->{cv}->send($res);
99 448         5701 $self->pop_command;
100             }
101             }
102             else
103             {
104 83         258 my $batch = shift @{ $self->request_buffer };
  83         275  
105 83         479 $batch->{cv}->croak($res);
106 83         1252 $self->pop_command;
107             }
108             }
109 674         4182 };
110              
111 674         2878 $self->on_next_response($handler);
112              
113 674         1573 $self->{ready} = 0;
114 674         2855 $self->emit('send', $cmd, $args);
115 674         3707 $self->{handle}->push_write("$line\015\012");
116              
117 674         58040 $self;
118             }
119              
120             sub clear_command
121             {
122 41     41 0 112 my($self) = @_;
123 41         92 @{ $self->request_buffer } = ();
  41         133  
124 41         138 $self->{ready} = 1;
125             }
126              
127             1;
128              
129             __END__