working remote module loading
[scpubgit/Tak.git] / takc
1 use strictures 1;
2 use Tak::JSONChannel;
3 use Tak::Router;
4 use IPC::Open2;
5 use Tak::Remote;
6 use Tak::ModuleSender;
7 use Tak::ServiceManager;
8 use Term::ReadLine;
9
10 my $pid = open2(my $out, my $in, $^X, qw(-Ilib takd))
11   or die "Couldn't open2 child: $!";
12
13 my $channel = Tak::JSONChannel->new(
14   read_fh => $out,
15   write_fh => $in
16 );
17
18 my $router = Tak::Router->new(
19   channel => $channel,
20   local_request_handlers => {
21     MODULE_SENDER => Tak::ServiceManager->new(
22       service => Tak::ModuleSender->new
23     )
24   },
25 );
26
27 my $remote = Tak::Remote->new(
28   router => $router,
29   name => 'EVAL'
30 );
31
32 my $read = Term::ReadLine->new('REPL');
33
34 while (1) {
35   my $line = $read->readline('re.pl$ ');
36   exit unless defined $line;
37   next unless length $line;
38   my $reply = [ $remote->blocking_request(eval => $line) ];
39   if ($reply->[0] eq 'MISTAKE') {
40     die "Botch: ".join(': ', @{$reply}[1,2]);
41   }
42   my $ret = $reply->[1];
43   print $ret->{return};
44   if ($ret->{stdout}) {
45     chomp($ret->{stdout});
46     print "STDOUT:\n${\$ret->{stdout}}\n";
47   }
48   if ($ret->{stderr}) {
49     chomp($ret->{stderr});
50     print "STDERR:\n${\$ret->{stderr}}\n";
51   }
52 }