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   14231 use strict;
  24         58  
  24         987  
4 24     24   166 use warnings;
  24         48  
  24         1109  
5 24     24   418 use 5.010;
  24         79  
6 24     24   121 use Moo::Role;
  24         53  
  24         239  
7 24     24   11815 use AnyEvent;
  24         53  
  24         19683  
8              
9             # ABSTRACT: Request buffer role for asynchronous ftp client
10             our $VERSION = '0.20'; # VERSION
11              
12              
13             has request_buffer => (
14             is => 'ro',
15             default => sub { [] },
16             );
17              
18             sub push_command
19             {
20 500     500 0 1932 my $cv;
21              
22 500 100       1967 $cv = pop if (ref $_[-1]) eq 'AnyEvent::CondVar';
23 500   66     14504 $cv //= AnyEvent->condvar;
24              
25 500         4373 my($self, @commands) = @_;
26              
27 500         923 push @{ $self->request_buffer }, { cmd => \@commands, cv => $cv };
  500         5030  
28              
29 500         1689 $self->pop_command;
30              
31 500         3035 $cv;
32             }
33              
34             sub unshift_command
35             {
36 31     31 0 67 my $cv;
37              
38 31 50       151 $cv = pop if (ref $_[-1]) eq 'AnyEvent::CondVar';
39 31   33     201 $cv //= AnyEvent->condvar;
40              
41 31         103 my($self, @commands) = @_;
42              
43 31         161 unshift @{ $self->request_buffer }, { cmd => \@commands, cv => $cv };
  31         243  
44              
45 31         136 $self->pop_command;
46              
47 31         443 $cv;
48             }
49              
50             sub pop_command
51             {
52 1243     1243 0 2582 my($self) = @_;
53              
54 1243   100     3872 $self->{ready} //= 1;
55              
56 1243 100       3621 return $self unless defined $self->{handle};
57              
58 1240 100       1923 unless(@{ $self->request_buffer } > 0)
  1240         4196  
59             {
60 565         1070 $self->{ready} = 1;
61 565         3757 return $self;
62             }
63              
64 675 100       1704 return unless $self->{ready};
65              
66 674         1183 my($cmd, $args, $cb) = @{ shift @{ $self->request_buffer->[0]->{cmd} } };
  674         953  
  674         6268  
67 674 100       7236 my $line = defined $args ? join(' ', $cmd, $args) : $cmd;
68              
69 674         1258 my $handler;
70             $handler = sub {
71 744     744   1456 my $res = shift;
72 744 100       2172 if(defined $cb)
73             {
74 47         219 my $error = $cb->($res);
75 47 50       256 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       2735 if($res->is_preliminary)
83             {
84 70         302 $self->on_next_response($handler);
85             }
86             else
87             {
88 674         1590 $self->{ready} = 1;
89 674 100       1742 if($res->is_success)
90             {
91 591 100       969 if(@{ $self->request_buffer->[0]->{cmd} } > 0)
  591         3242  
92             {
93 143         503 $self->pop_command;
94             }
95             else
96             {
97 448         825 my $batch = shift @{ $self->request_buffer };
  448         1124  
98 448         2554 $batch->{cv}->send($res);
99 448         6837 $self->pop_command;
100             }
101             }
102             else
103             {
104 83         142 my $batch = shift @{ $self->request_buffer };
  83         290  
105 83         683 $batch->{cv}->croak($res);
106 83         1260 $self->pop_command;
107             }
108             }
109 674         8422 };
110              
111 674         5007 $self->on_next_response($handler);
112              
113 674         1391 $self->{ready} = 0;
114 674         6569 $self->emit('send', $cmd, $args);
115 674         4231 $self->{handle}->push_write("$line\015\012");
116              
117 674         62957 $self;
118             }
119              
120             sub clear_command
121             {
122 41     41 0 175 my($self) = @_;
123 41         69 @{ $self->request_buffer } = ();
  41         119  
124 41         108 $self->{ready} = 1;
125             }
126              
127             1;
128              
129             __END__