add meta service
[scpubgit/Tak.git] / lib / Tak / REPL.pm
CommitLineData
8b6c1f59 1package Tak::REPL;
2
3use Term::ReadLine;
4use Moo;
5
6has world => (is => 'ro', required => 1);
7
8has remote => (is => 'lazy');
9
857f4834 10sub _build_remote {
11 my ($self) = @_;
12 my $world = $self->world;
13 $world->remote_for('meta')->blocking_request(
14 register => eval => 'Tak::EvalService'
15 );
16 $world->remote_for('eval')
17}
8b6c1f59 18
19sub run {
20 my $remote = $_[0]->remote;
21 my $read = Term::ReadLine->new('REPL');
22
23 while (1) {
24 my $line = $read->readline('re.pl$ ');
25 last unless defined $line;
26 next unless length $line;
27 my @reply = $remote->blocking_request(eval => $line);
28 if ($reply[0] eq 'MISTAKE') {
29 die "Botch: ".join(': ', @reply[1,2]);
30 }
31 my $ret = $reply[1];
32 print $ret->{return};
33 if ($ret->{stdout}) {
34 chomp($ret->{stdout});
35 print "STDOUT:\n${\$ret->{stdout}}\n";
36 }
37 if ($ret->{stderr}) {
38 chomp($ret->{stderr});
39 print "STDERR:\n${\$ret->{stderr}}\n";
40 }
41 }
42}