App-NDTools

 view release on metacpan or  search on metacpan

lib/App/NDTools/NDProc/Module/Pipe.pm  view on Meta::CPAN

package App::NDTools::NDProc::Module::Pipe;

use strict;
use warnings FATAL => 'all';
use parent 'App::NDTools::NDProc::Module';

use IPC::Run3;
use Log::Log4Cli;
use App::NDTools::Slurp qw(s_decode s_encode);
use Struct::Path 0.80 qw(path);

our $VERSION = '0.08';

sub MODINFO { "Modify structure using external process" }

sub arg_opts {
    my $self = shift;

    return (
        $self->SUPER::arg_opts(),
        'command|cmd=s' => \$self->{OPTS}->{command},
        'strict' => \$self->{OPTS}->{strict},
    )
}

sub check_rule {
    my ($self, $rule) = @_;
    my $out = $self;

    push @{$rule->{path}}, '' unless (@{$rule->{path}});

    unless (defined $rule->{command}) {
        log_error { 'Command to run should be defined' };
        $out = undef;
    }

    return $out;
}

sub process_path {
    my ($self, $data, $path, $spath, $opts) = @_;

    my @refs = eval { path(${$data}, $spath, strict => $opts->{strict}) };
    die_fatal "Failed to lookup path '$path'", 4 if ($@);

    for my $r (@refs) {
        my $in = s_encode(${$r}, 'JSON', { pretty => 1 });

        my ($out, $err);
        run3($opts->{command}, \$in, \$out, \$err, { return_if_system_error => 1});
        die_fatal "Failed to run '$opts->{command}' ($!)", 2
            if ($? == -1); # run3 specific
        unless ($? == 0) {
            die_fatal "'$opts->{command}' exited with " . ($? >> 8) .
                ($err ? " (" . join(" ", split("\n", $err)) . ")" : ""), 16;
        }

        ${$r} = s_decode($out, 'JSON');
    }
}

1; # End of App::NDTools::NDProc::Module::Pipe

__END__

=head1 NAME

Pipe - pass structure to external program and apply result.

=head1 OPTIONS

=over 4

=item B<--[no]blame>

Blame calculation toggle. Enabled by default.

=item B<--command|--cmd> E<lt>commandE<gt>

Command to run. JSON encoded structure passed to it's STDIN and it's STDOUT



( run in 0.570 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )