add set command and switch completely to . as an object seperator
[org.ibex.xt-crawshaw.git] / src / java / org / ibex / xt / shell / Command.java
index 0ff2952..f5ad6fb 100644 (file)
@@ -1,10 +1,13 @@
 package org.ibex.xt.shell;
 
-import java.util.*;
-
+import java.io.StringReader;
 import java.io.Writer;
 import java.io.IOException;
 
+import java.util.*;
+
+import org.ibex.js.*;
+
 public abstract class Command {
     /** Returns the command name. */
     public abstract String name();
@@ -97,7 +100,7 @@ public abstract class Command {
         public String help() { return "Print the path to the current object."; }
         public void execute(Writer w, String[] c, Env env) throws IOException {
             if (c.length != 1) { w.write(usage()); return; }
-            w.write(env.path.equals("") ? "/" : env.path.replace('.', '/'));
+            w.write(env.path.equals("") ? "." : env.path);
             w.write("\n");
         }
     }
@@ -109,13 +112,13 @@ public abstract class Command {
         public String help() { return
             "Chnages the current object that all other commands use "+
             "as the base for running.\n Pass either a relative path "+
-            "(e.g. in /prevalent, type cd myob, now in /prevalent/myob) "+
-            "or an absolute path (e.g. cd /prevalent/myob).\n\n" +
+            "(e.g. in .prevalent, type cd myob, now in .prevalent.myob) "+
+            "or an absolute path (e.g. cd .prevalent.myob).\n\n" +
             "To go up one level, cd .. can be used.";
         }
         public void execute(Writer w, String[] c, Env env) throws IOException {
             if (c.length > 2) w.write(usage());
-            else if (c.length == 1 || c[1].equals("") || c[1].equals("/")) env.path = "";
+            else if (c.length == 1 || c[1].equals("") || c[1].equals(".")) env.path = "";
             else if (c[1].equals("..")) {
                 String n = env.path;
                 n = n.substring(0, n.lastIndexOf('.'));
@@ -131,7 +134,7 @@ public abstract class Command {
                 } else {
                     List l = ((Request.Key.Res)ret).keys();
                     if (l.size() == 0) {
-                        w.write("cd ");
+                        w.write("error: ");
                         w.write(c[1]);
                         w.write(": no such path\n");
                     } else {
@@ -150,11 +153,61 @@ public abstract class Command {
         public void execute(Writer w, String[] c, Env env) throws IOException {
             if (c.length == 1) { w.write(usage()); }
 
-            String[] r = new String[c.length - 1];
-            for (int i=0; i < r.length; i++) r[i] = env.path(c[i + 1]);
-            // Object ret = send(new KeyRequest( FIXME: CompositeRequest
+            Request.Key[] r = new Request.Key[c.length - 1];
+            for (int i=0; i < r.length; i++) r[i] = new Request.RemoveKey(env.path(c[i + 1]));
+
+            Request.Response ret = env.send(new Request.Composite(r, false));
+            if (!(ret instanceof Request.Composite.Res)) {
+                w.write("error: ");
+                w.write(ret.error().getMessage());
+                w.write("\n");
+            } else {
+                Request.Response[] res = ((Request.Composite.Res)ret).responses();
+                for (int i=0; i < res.length; i++) {
+                    if (res[i] instanceof Request.RemoveKey.Res) {
+                        boolean rm = ((Request.RemoveKey.Res)res[i]).removed();
+                        if (!rm) {
+                            w.write("error: cannot remove '");
+                            w.write(c[i + 1]);
+                            w.write("': no such key\n");
+                        }
+                    } else {
+                        w.write("error: cannot remove '");
+                        w.write(c[i + 1]);
+                        w.write("': ");
+                        w.write(res[i].error().getMessage());
+                        w.write("\n");
+                    }
+                }
+            }
         }
     }
 
+    public static class Set extends Command {
+        public String name() { return "set"; }
+        public String usage() { return "[name] [object]"; }
+        public String summary() { return "Sets ."; }
+        public String help() { return "Removes objects."; } // FIXME
+
+        public void execute(Writer w, String[] c, Env env) throws IOException {
+            if (c.length < 3) { w.write(usage()); }
+
+            String m = c[1];
+            String s = "return (";
+            for (int i=2; i < c.length; i++) s += c[i];
+            s += ");";
+
+            JS js;
+            try { js = JS.fromReader("input", 0, new StringReader(s)); }
+            catch (IOException e) {
+                w.write("error: ");
+                w.write(e.getMessage());
+                w.write("\n");
+                return;
+            }
+
+            Request.Response ret = env.send(new Request.SetKey(env.path, m, js));
+        }
+    }
 
 }