better debugging output
[scpubgit/DKit.git] / bin / dx-shell
index 6848ed6..b540453 100644 (file)
@@ -7,6 +7,8 @@ use DX::Lib::FS;
 use Term::ReadLine;
 use Devel::Dwarn;
 use Sub::Quote;
+use YAML ();
+use Safe::Isa;
 
 my $solver = DX::Solver->new(observation_policy => sub { 1 });
 
@@ -23,14 +25,31 @@ my $tcl = Tcl->new;
 
 my $split = $tcl->curry::weak::SplitList;
 
-my (@res, @last_q);
+my ($r, $res, @last_q);
+
+my $last_mode;
+
+sub show {
+  $r = ($res->isa('DX::Result') ? $res : $res->next);
+  unless ($r) { warn "false\n"; return; }
+  if (my @act = $r->actions) {
+    warn YAML::Dump([ map $_->as_structure, @act ]);
+  }
+  my $values = $r->all_values;
+  unless (keys %$values) {
+    warn "---\ntrue\n"; return;
+  }
+  warn YAML::Dump({
+    map +($_ => ($values->{$_}->$_does('DX::Role::Set')
+                  ? [ $values->{$_}->all ]
+                  : $values->{$_} )),
+      keys %$values
+  });
+}
 
 sub do_query {
-  @res = $solver->query(@last_q)->results;
-  Dwarn([ map {
-    my @act = $_->actions;
-    ((@act ? \@act : ()), $_->all_values);
-  } @res ]);
+  $res = $solver->$last_mode(@last_q);
+  show();
 }
 
 sub expand_def {
@@ -40,23 +59,29 @@ sub expand_def {
 }
 
 sub expand_body {
-  my ($body) = @_;
+  my (@body) = @_;
   local our @Body_Parts;
-  $tcl->Eval($body);
+  $tcl->Eval(@body);
   return @Body_Parts;
 }
 
-$tcl->CreateCommand(query => sub {
-  my (undef, undef, undef, $vars, $body) = @_;
-  @last_q = expand_def($vars, $body);
+sub q_command {
+  my ($this_mode, undef, undef, undef, $body) = @_;
+  $last_mode = $this_mode;
+  if ($body) {
+    @last_q = expand_body($body);
+  }
   do_query();
   return;
-});
+}
+
+$tcl->CreateCommand('?' => sub { q_command(query => @_) });
+$tcl->CreateCommand('?!' => sub { q_command(solve => @_) });
+$tcl->CreateCommand('!?' => sub { q_command(solve => @_) });
+$tcl->CreateCommand('!' => sub { q_command(ensure => @_) });
 
 $tcl->CreateCommand(run => sub {
-  foreach my $ind ($res[0]->independent_actions) {
-    my $cl = ref($ind);
-    warn +(split('::', $cl))[-1]."\n";
+  foreach my $ind ($r->independent_actions) {
     $solver->run_action($ind);
   }
   do_query();
@@ -66,7 +91,7 @@ $tcl->CreateCommand(run => sub {
 $tcl->CreateCommand(dump => sub {
   my (undef, undef, undef, $to_dump) = @_;
   my $filter = quote_sub($to_dump);
-  Dwarn(map $filter->($_), @res);
+  Dwarn($filter->($r));
 });
 
 sub mangle_args {
@@ -92,12 +117,6 @@ foreach my $rule (keys %{$solver->rule_set->rules}) {
   $tcl->CreateCommand($rule => $rule_sub);
 }
 
-$tcl->CreateCommand(exists => sub {
-  my (undef, undef, undef, $vars, $body) = @_;
-  push our @Body_Parts, [ exists => expand_def($vars, $body) ];
-  return;
-});
-
 $tcl->CreateCommand(foreach => sub {
   my (undef, undef, undef, $var, $body, $each_body) = @_;
   push our @Body_Parts, [
@@ -105,6 +124,16 @@ $tcl->CreateCommand(foreach => sub {
   ];
   return;
 });
+
+$tcl->CreateCommand(findall => sub {
+  my (undef, undef, undef, $coll_var, $name_var, $body) = @_;
+  push our @Body_Parts, [
+    findall => $coll_var => $name_var => expand_body($body)
+  ];
+  return;
+});
+
+$tcl->CreateCommand(n => \&show);
   
 #$tcl->Eval(q{query D {directory_at D 't'; mode D '0755'; }});