package Tak::EvalService;
use Eval::WithLexicals;
-use Moo;
use Data::Dumper::Concise;
use Capture::Tiny qw(capture);
+use Moo;
+
+with 'Tak::Role::Service';
has 'eval_withlexicals' => (is => 'lazy');
sub handle_eval {
my ($self, $perl) = @_;
unless ($perl) {
- return MISTAKE => eval_input => "No code supplied";
+ die [ mistake => eval_input => "No code supplied" ];
}
if (my $ref = ref($perl)) {
- return MISTAKE => eval_input => "Code was a ${ref} reference";
+ die [ mistake => eval_input => "Code was a ${ref} reference" ];
}
- my ($code, @ret);
+ my ($ok, @ret);
my ($stdout, $stderr);
if (eval {
($stdout, $stderr) = capture {
};
1
}) {
- $code = 'RESULT';
+ $ok = 1;
} else {
- ($code, @ret) = (FAILURE => $@);
+ ($ok, @ret) = (0, $@);
}
my $dumped_ret;
unless (eval { $dumped_ret = Dumper(@ret); 1 }) {
- $dumped_ret = "Error dumping ${code} result: $@";
- $code = 'FAILURE';
+ $dumped_ret = "Error dumping ${\($ok ? 'result' : 'exception')}: $@";
+ $ok = 0;
}
- return $code => {
- stdout => $stdout, stderr => $stderr, return => $dumped_ret
+ return {
+ stdout => $stdout, stderr => $stderr,
+ ($ok ? 'return' : 'exception') => $dumped_ret
};
}