shell tweaks
[scpubgit/DKit.git] / bin / dx-shell
CommitLineData
eed368c9 1#!/usr/bin/env perl
2
3use strictures 1;
4use curry;
5use DX::Solver;
6use DX::Lib::FS;
7use Term::ReadLine;
8
9my $solver = DX::Solver->new(observation_policy => sub { 1 });
10
11DX::Lib::FS->new->load_into($solver);
12
13#::Dwarn(
14# [ $solver->query([ 'D' ], [ directory_at => 'D' => \'t' ])->results ]
15# ->[0]->value_for('D')
16#);
17
18use Tcl;
19
20my $tcl = Tcl->new;
21
22my $split = $tcl->curry::weak::SplitList;
23
24my (@res, @last_q);
25
26sub do_query {
27 @res = $solver->query(@last_q)->results;
28 Dwarn([ map {
29 my @act = $_->actions;
30 ((@act ? \@act : ()), $_->all_values);
31 } @res ]);
32}
33
34$tcl->CreateCommand(query => sub {
35 my (undef, undef, undef, $vars, $body) = @_;
36 my @varnames = $split->($vars);
37 local our @Body_Parts;
38 $tcl->Eval($body);
39 @last_q = (\@varnames, @Body_Parts);
40 do_query();
41 return;
42});
43
44$tcl->CreateCommand(run => sub {
45 foreach my $ind ($res[0]->independent_actions) {
46 my $cl = ref($ind);
47 warn +(split('::', $cl))[-1]."\n";
48 $solver->run_action($ind);
49 }
50 do_query();
51 return;
52});
53
54sub mangle_args {
55 my @args = @_;
56 map { $_ =~ /^'(.*)'$/ ? \do { my $x = $1 } : $_ } @args;
57}
58
59my $rule_sub = sub {
60 my (undef, undef, $name, @args) = @_;
61 push our @Body_Parts, [ $name => mangle_args(@args) ];
62 return;
63};
64
65foreach my $rule (keys %{$solver->rule_set->rules}) {
66 $rule =~ s/\/\d+$//;
67 $tcl->CreateCommand($rule => $rule_sub);
68}
69
70#$tcl->Eval(q{query D {directory_at D 't'; mode D '0755'; }});
71
72my $rl = Term::ReadLine->new;
73
74my $cmd;
75
2e60bb64 76while (defined(my $line = $rl->readline(length($cmd)?'> ':'$ '))) {
77 $cmd .= "${line}\n";
eed368c9 78 if ($tcl->call(info => complete => $cmd)) {
79 $tcl->Eval($cmd);
80 $cmd = '';
81 }
82}