App-Task
view release on metacpan or search on metacpan
lib/App/Task.pm view on Meta::CPAN
package App::Task;
use strict;
use warnings;
our $VERSION = '0.03';
use IPC::Open3::Utils ();
use Text::OutputFilter;
use IO::Interactive::Tiny ();
BEGIN {
no warnings "redefine";
require Tie::Handle::Base;
*Text::OutputFilter::OPEN = \&Tie::Handle::Base::OPEN;
my $of_print = \&Text::OutputFilter::PRINT;
*Text::OutputFilter::PRINT = sub { $of_print->(@_); return 1 };
}
sub import {
no strict 'refs'; ## no critic
*{ caller() . '::task' } = \&task;
}
our $depth = 0;
our $level = 0;
our $steps = {};
our $prev_depth = 1;
sub _nl { local $depth = 0; print "\n" }
sub _sys {
my @cmd = @_;
my $rv = IPC::Open3::Utils::run_cmd(
@cmd,
{
autoflush => { stdout => 1, stderr => 1 },
carp_open3_errors => 1,
close_stdin => 1,
}
);
return $rv;
}
sub _escape {
my ( $str, $leave_slashes ) = @_;
$str =~ s/\\/\\\\/g unless $leave_slashes;
$str =~ s/\n/\\n/g;
$str =~ s/\t/\\t/g;
return $str;
}
sub _indent {
my ($string) = @_;
warn "_indent() called outside of task()\n" if $depth < 0;
my $i = $depth <= 0 ? "" : " " x $depth;
$string =~ s/\n/\n$i/msg;
return "$i$string";
}
sub tie_task {
close ORIGOUT;
close ORIGERR;
open( *ORIGOUT, ">&", \*STDOUT );
open( *ORIGERR, ">&", \*STDERR );
ORIGOUT->autoflush();
ORIGERR->autoflush();
my $o = tie( *STDOUT, "Text::OutputFilter", 0, \*ORIGOUT, \&_indent );
my $e = tie( *STDERR, "Text::OutputFilter", 0, \*ORIGERR, \&_indent );
return ( $o, $e );
}
sub task {
my ( $msg, $code, $cmdhr ) = @_;
( run in 0.553 second using v1.01-cache-2.11-cpan-5837b0d9d2c )