package Canella::Exec::Local;
use Moo;
use IPC::Run ();
use Canella::Log;

has stdout      => ( is => 'rw' );
has stderr      => ( is => 'rw' );
has has_error   => ( is => 'rw' );
has error       => ( is => 'rw' );
has cmd => (
    is => 'ro',
    isa => sub { ref $_[0] eq 'ARRAY' },
    required => 1,
);

sub execute {
    my $self = shift;

    infof "[localhost :: executing] %s", join ' ', @{$self->cmd};
    my $result = IPC::Run::run($self->cmd, \my $stdin, \my $stdout, \my $stderr);
    $self->has_error(! $result);
    $self->error($?);

    chomp $stdout;
    chomp $stderr;
    $self->stdout($stdout);
    $self->stderr($stderr);

    foreach my $name (qw(stdout stderr)) {
        foreach my $line ( split /\n/, $self->$name ) {
            infof "[localhost :: %s] %s", $name, $line;
        }
    }
}

1;