Commit | Line | Data |
36cf3bcb |
1 | package Tak::EvalService; |
2 | |
3 | use Eval::WithLexicals; |
36cf3bcb |
4 | use Data::Dumper::Concise; |
5 | use Capture::Tiny qw(capture); |
31a246e4 |
6 | use Moo; |
7 | |
8 | with 'Tak::Role::Service'; |
36cf3bcb |
9 | |
10 | has 'eval_withlexicals' => (is => 'lazy'); |
11 | |
12 | sub _build_eval_withlexicals { |
13 | Eval::WithLexicals->new |
14 | } |
15 | |
16 | sub handle_eval { |
17 | my ($self, $perl) = @_; |
18 | unless ($perl) { |
31a246e4 |
19 | die [ mistake => eval_input => "No code supplied" ]; |
36cf3bcb |
20 | } |
21 | if (my $ref = ref($perl)) { |
31a246e4 |
22 | die [ mistake => eval_input => "Code was a ${ref} reference" ]; |
36cf3bcb |
23 | } |
31a246e4 |
24 | my ($ok, @ret); |
36cf3bcb |
25 | my ($stdout, $stderr); |
26 | if (eval { |
27 | ($stdout, $stderr) = capture { |
28 | @ret = $self->eval_withlexicals->eval($perl); |
29 | }; |
30 | 1 |
31 | }) { |
31a246e4 |
32 | $ok = 1; |
36cf3bcb |
33 | } else { |
31a246e4 |
34 | ($ok, @ret) = (0, $@); |
36cf3bcb |
35 | } |
36 | my $dumped_ret; |
37 | unless (eval { $dumped_ret = Dumper(@ret); 1 }) { |
31a246e4 |
38 | $dumped_ret = "Error dumping ${\($ok ? 'result' : 'exception')}: $@"; |
39 | $ok = 0; |
36cf3bcb |
40 | } |
31a246e4 |
41 | return { |
42 | stdout => $stdout, stderr => $stderr, |
43 | ($ok ? 'return' : 'exception') => $dumped_ret |
36cf3bcb |
44 | }; |
45 | } |
46 | |
47 | 1; |