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   14928 use strict;
  24         128  
  24         802  
4 24     24   137 use warnings;
  24         52  
  24         714  
5 24     24   491 use 5.010;
  24         89  
6 24     24   144 use Moo::Role;
  24         66  
  24         167  
7 24     24   8918 use AnyEvent;
  24         65  
  24         18277  
8              
9             # ABSTRACT: Request buffer role for asynchronous ftp client
10             our $VERSION = '0.17'; # VERSION
11              
12              
13             has request_buffer => (
14             is => 'ro',
15             default => sub { [] },
16             );
17              
18             sub push_command
19             {
20 500     500 0 1799 my $cv;
21              
22 500 100       1818 $cv = pop if (ref $_[-1]) eq 'AnyEvent::CondVar';
23 500   66     12167 $cv //= AnyEvent->condvar;
24              
25 500         4814 my($self, @commands) = @_;
26              
27 500         941 push @{ $self->request_buffer }, { cmd => \@commands, cv => $cv };
  500         3009  
28              
29 500         1811 $self->pop_command;
30              
31 500         3554 $cv;
32             }
33              
34             sub unshift_command
35             {
36 31     31 0 95 my $cv;
37              
38 31 50       241 $cv = pop if (ref $_[-1]) eq 'AnyEvent::CondVar';
39 31   33     196 $cv //= AnyEvent->condvar;
40              
41 31         115 my($self, @commands) = @_;
42              
43 31         80 unshift @{ $self->request_buffer }, { cmd => \@commands, cv => $cv };
  31         236  
44              
45 31         169 $self->pop_command;
46              
47 31         443 $cv;
48             }
49              
50             sub pop_command
51             {
52 1243     1243 0 2668 my($self) = @_;
53              
54 1243   100     3658 $self->{ready} //= 1;
55              
56 1243 100       3030 return $self unless defined $self->{handle};
57              
58 1240 100       2004 unless(@{ $self->request_buffer } > 0)
  1240         3599  
59             {
60 565         1068 $self->{ready} = 1;
61 565         3647 return $self;
62             }
63              
64 675 100       1769 return unless $self->{ready};
65              
66 674         1137 my($cmd, $args, $cb) = @{ shift @{ $self->request_buffer->[0]->{cmd} } };
  674         1102  
  674         2641  
67 674 100       2453 my $line = defined $args ? join(' ', $cmd, $args) : $cmd;
68              
69 674         1165 my $handler;
70             $handler = sub {
71 744     744   1646 my $res = shift;
72 744 100       1999 if(defined $cb)
73             {
74 47         235 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       2372 if($res->is_preliminary)
83             {
84 70         248 $self->on_next_response($handler);
85             }
86             else
87             {
88 674         1536 $self->{ready} = 1;
89 674 100       1882 if($res->is_success)
90             {
91 591 100       1101 if(@{ $self->request_buffer->[0]->{cmd} } > 0)
  591         2809  
92             {
93 143         438 $self->pop_command;
94             }
95             else
96             {
97 448         914 my $batch = shift @{ $self->request_buffer };
  448         1322  
98 448         2272 $batch->{cv}->send($res);
99 448         6831 $self->pop_command;
100             }
101             }
102             else
103             {
104 83         270 my $batch = shift @{ $self->request_buffer };
  83         272  
105 83         533 $batch->{cv}->croak($res);
106 83         1265 $self->pop_command;
107             }
108             }
109 674         4327 };
110              
111 674         3053 $self->on_next_response($handler);
112              
113 674         1580 $self->{ready} = 0;
114 674         2654 $self->emit('send', $cmd, $args);
115 674         3720 $self->{handle}->push_write("$line\015\012");
116              
117 674         62646 $self;
118             }
119              
120             sub clear_command
121             {
122 41     41 0 103 my($self) = @_;
123 41         92 @{ $self->request_buffer } = ();
  41         135  
124 41         132 $self->{ready} = 1;
125             }
126              
127             1;
128              
129             __END__