File Coverage

blib/lib/AnyEvent/FTP/Client/Role/FetchTransfer.pm
Criterion Covered Total %
statement 39 44 88.6
branch 12 16 75.0
condition n/a
subroutine 13 14 92.8
pod 0 3 0.0
total 64 77 83.1


line stmt bran cond sub pod time code
1             package AnyEvent::FTP::Client::Role::FetchTransfer;
2              
3 24     24   16417 use strict;
  24         63  
  24         831  
4 24     24   135 use warnings;
  24         58  
  24         636  
5 24     24   482 use 5.010;
  24         89  
6 24     24   141 use Moo::Role;
  24         53  
  24         173  
7              
8             # ABSTRACT: Fetch transfer interface for AnyEvent::FTP objects
9             our $VERSION = '0.17'; # VERSION
10              
11             sub xfer
12             {
13 21     21 0 84 my($self, $fh, $local) = @_;
14              
15 21         132 my $handle = $self->handle($fh);
16              
17 21 100       94 return unless defined $local;
18              
19             $handle->on_read(sub {
20             $handle->push_read(sub {
21 38         2096 $local->($_[0]{rbuf});
22 38         137 $_[0]{rbuf} = '';
23 19     19   2374 });
24 19         191 });
25             }
26              
27             sub convert_local
28             {
29 21     21 0 95 my($self, $local) = @_;
30              
31 21 100       84 return unless defined $local;
32 19 100       121 return $local if ref($local) eq 'CODE';
33              
34 15 100       77 if(ref($local) eq 'SCALAR')
    100          
    50          
35             {
36             return sub {
37 22     22   101 $$local .= shift;
38 11         168 };
39             }
40             elsif(ref($local) eq 'GLOB')
41             {
42             return sub {
43 4     4   17 print $local shift;
44 2         13 };
45             }
46             elsif(ref($local) eq '')
47             {
48 2         167 open my $fh, '>', $local;
49 2     2   43 $self->on_close(sub { close $fh });
  2         153  
50             return sub {
51 4     4   32 print $fh shift;
52 2         14 };
53             }
54             else
55             {
56 0         0 die 'unimplemented: ' . ref $local;
57             }
58             }
59              
60             sub push_command
61             {
62 21     21 0 70 my $self = shift;
63             my $cv = $self->{client}->push_command(
64 21         143 @_,
65             );
66              
67             $cv->cb(sub {
68 0     0   0 eval { $cv->recv };
  0         0  
69 0         0 my $err = $@;
70 0 0       0 $self->{cv}->croak($err) if $err;
71 21         282 });
72              
73             $self->on_eof(sub {
74             $cv->cb(sub {
75 21         314 my $res = eval { $cv->recv };
  21         107  
76 21 50       277 $self->{cv}->send($res) unless $@;
77 21     21   324 });
78 21         440 });
79             }
80              
81             1;
82              
83             __END__