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 )