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   9883 use strict;
  24         94  
  24         581  
4 24     24   97 use warnings;
  24         40  
  24         488  
5 24     24   315 use 5.010;
  24         61  
6 24     24   90 use Moo::Role;
  24         38  
  24         120  
7 24     24   6532 use AnyEvent;
  24         61  
  24         12755  
8              
9             # ABSTRACT: Request buffer role for asynchronous ftp client
10             our $VERSION = '0.19'; # VERSION
11              
12              
13             has request_buffer => (
14             is => 'ro',
15             default => sub { [] },
16             );
17              
18             sub push_command
19             {
20 500     500 0 1286 my $cv;
21              
22 500 100       1406 $cv = pop if (ref $_[-1]) eq 'AnyEvent::CondVar';
23 500   66     8506 $cv //= AnyEvent->condvar;
24              
25 500         3420 my($self, @commands) = @_;
26              
27 500         684 push @{ $self->request_buffer }, { cmd => \@commands, cv => $cv };
  500         1801  
28              
29 500         1321 $self->pop_command;
30              
31 500         2259 $cv;
32             }
33              
34             sub unshift_command
35             {
36 31     31 0 70 my $cv;
37              
38 31 50       164 $cv = pop if (ref $_[-1]) eq 'AnyEvent::CondVar';
39 31   33     137 $cv //= AnyEvent->condvar;
40              
41 31         92 my($self, @commands) = @_;
42              
43 31         59 unshift @{ $self->request_buffer }, { cmd => \@commands, cv => $cv };
  31         262  
44              
45 31         127 $self->pop_command;
46              
47 31         269 $cv;
48             }
49              
50             sub pop_command
51             {
52 1243     1243 0 1814 my($self) = @_;
53              
54 1243   100     2555 $self->{ready} //= 1;
55              
56 1243 100       2128 return $self unless defined $self->{handle};
57              
58 1240 100       1451 unless(@{ $self->request_buffer } > 0)
  1240         2695  
59             {
60 565         879 $self->{ready} = 1;
61 565         2319 return $self;
62             }
63              
64 675 100       1364 return unless $self->{ready};
65              
66 674         812 my($cmd, $args, $cb) = @{ shift @{ $self->request_buffer->[0]->{cmd} } };
  674         738  
  674         1887  
67 674 100       1881 my $line = defined $args ? join(' ', $cmd, $args) : $cmd;
68              
69 674         822 my $handler;
70             $handler = sub {
71 744     744   1103 my $res = shift;
72 744 100       1860 if(defined $cb)
73             {
74 47         154 my $error = $cb->($res);
75 47 50       145 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       1864 if($res->is_preliminary)
83             {
84 70         202 $self->on_next_response($handler);
85             }
86             else
87             {
88 674         1070 $self->{ready} = 1;
89 674 100       1377 if($res->is_success)
90             {
91 591 100       749 if(@{ $self->request_buffer->[0]->{cmd} } > 0)
  591         2039  
92             {
93 143         349 $self->pop_command;
94             }
95             else
96             {
97 448         578 my $batch = shift @{ $self->request_buffer };
  448         846  
98 448         1668 $batch->{cv}->send($res);
99 448         4115 $self->pop_command;
100             }
101             }
102             else
103             {
104 83         161 my $batch = shift @{ $self->request_buffer };
  83         237  
105 83         394 $batch->{cv}->croak($res);
106 83         985 $self->pop_command;
107             }
108             }
109 674         3003 };
110              
111 674         2122 $self->on_next_response($handler);
112              
113 674         1046 $self->{ready} = 0;
114 674         2131 $self->emit('send', $cmd, $args);
115 674         2654 $self->{handle}->push_write("$line\015\012");
116              
117 674         41663 $self;
118             }
119              
120             sub clear_command
121             {
122 41     41 0 119 my($self) = @_;
123 41         86 @{ $self->request_buffer } = ();
  41         119  
124 41         203 $self->{ready} = 1;
125             }
126              
127             1;
128              
129             __END__