AnyEvent-Proc
view release on metacpan or search on metacpan
lib/AnyEvent/Proc.pm view on Meta::CPAN
use strict;
use warnings;
package AnyEvent::Proc;
# ABSTRACT: Run external commands
use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::Util ();
use Try::Tiny;
use Class::Load;
use Exporter qw(import);
use Carp;
use POSIX;
our $VERSION = '0.105'; # VERSION
our @EXPORT_OK = qw(run run_cb reader writer);
sub _rpipe {
my ( $R, $W ) = AnyEvent::Util::portable_pipe;
(
$R,
AnyEvent::Handle->new(
fh => $W,
on_error => sub {
my ( $handle, $fatal, $message ) = @_;
AE::log warn => "error writing to handle: $message";
$handle->destroy;
},
),
);
}
sub _wpipe {
my ( $R, $W ) = AnyEvent::Util::portable_pipe;
(
AnyEvent::Handle->new(
fh => $R,
on_error => sub {
my ( $handle, $fatal, $message ) = @_;
AE::log warn => "error reading from handle: $message"
unless $message =~ m{unexpected end-of-file}i;
$handle->destroy;
},
),
$W,
);
}
sub _on_read_helper {
my ( $aeh, $sub ) = @_;
$aeh->on_read(
sub {
my $x = $_[0]->rbuf;
$_[0]->rbuf = '';
$sub->($x);
}
);
}
sub _read_on_scalar {
my ( $var, $sub ) = @_;
my $old = $$var || '';
tie $$var, __PACKAGE__ . '::TiedScalar', $sub;
$$var = $old;
$var;
}
sub _reaper {
lib/AnyEvent/Proc.pm view on Meta::CPAN
1;
package # hidden
AnyEvent::Proc::R;
use overload '""' => sub { shift->{fileno} };
sub A { shift->{r} }
sub B { shift->{w} }
sub on_timeout {
shift->A->on_wtimeout(pop);
}
sub stop_timeout {
shift->A->stop_wtimeout;
}
sub pipe {
my ( $self, $peer ) = @_;
$self->{proc}->pipe( $self => $peer );
}
sub readline_cb {
my ( $self, $cb ) = @_;
$self->{proc}->_readline_cb( $self => $cb );
}
sub readline_cv {
my ( $self, $cv ) = @_;
$self->{proc}->_readline_cv( $self => $cv );
}
sub readline_ch {
my ( $self, $ch ) = @_;
$self->{proc}->_readline_ch( $self => $ch );
}
sub readlines_cb {
my ( $self, $cb ) = @_;
$self->{proc}->_readlines_cb( $self => $cb );
}
sub readlines_ch {
my ( $self, $ch ) = @_;
$self->{proc}->_readlines_cb( $self => $ch );
}
sub readline {
shift->readline_cv->recv;
}
1;
package # hidden
AnyEvent::Proc::W;
use overload '""' => sub { shift->{fileno} };
use Try::Tiny;
sub A { shift->{w} }
sub B { shift->{r} }
sub finish {
shift->A->destroy;
}
sub on_timeout {
shift->A->on_rtimeout(pop);
}
sub stop_timeout {
shift->A->stop_rtimeout;
}
sub write {
my ( $self, $type, @args ) = @_;
my $ok = 0;
try {
$self->A->push_write( $type => @args );
$ok = 1;
}
catch {
AE::log note => $_;
};
$ok;
}
sub writeln {
my ( $self, @lines ) = @_;
my $eol = $self->{proc}->_eol;
$self->write( $_ . $eol ) for @lines;
$self;
}
sub pull { die 'UNIMPLEMENTED' }
1;
package # hidden
AnyEvent::Proc::TiedScalar;
use Tie::Scalar;
our @ISA = ('Tie::Scalar');
sub TIESCALAR {
bless pop, shift;
}
sub FETCH {
undef;
}
sub STORE {
shift->(pop);
}
1;
( run in 0.680 second using v1.01-cache-2.11-cpan-f56aa216473 )