add mkdir and replace functions
[org.ibex.xt-crawshaw.git] / src / java / org / ibex / xt / shell / Command.java
index 04ca7b1..c7f3025 100644 (file)
@@ -160,12 +160,118 @@ public abstract class Command {
         }
     }
 
+    public static class Replace extends Command {
+        public Replace(Shell s) { super(s); }
+        public String name() { return "replace"; }
+        public String params() { return "[key] [value]"; }
+        public String summary() { return "Sets a key to a specific value."; }
+        public String help() { return
+            "Sets a key to a specific value. This function accepts " +
+            "an xt shell path for the key name (eg. /foo/bar), and a " +
+            "script object for the value (eg. {}, [], \"foo\").\n\n" +
+
+            "If the key does not already exist, it is created, but an " +
+            "error is thrown if the parent object of the key does not " +
+            "exist.\n\n" +
+
+            "WARNING: This function is dangerous. It gives you a " +
+            "quick and easy way to replace your entire data set with "+
+            "an empty object.";
+        }
+        public void execute(Writer w, String[] c) throws IOException {
+            if (c.length < 3) { usage(w); return; }
+            try {
+                List path = fromShellPath(c[1]);
+                Object key = path.remove(path.size() - 1);
+                Object po = shell.getFromPath(path.toArray());
+
+                if (po == null || !(po instanceof JS))
+                    throw new Shell.BadPathException();
+                JS parent = (JS)po;
+
+                String func = "prevalent.";
+                for (int i=0; i < path.size(); i++)
+                    func += path.get(i) + ".";
+                func += key + " = ";
+                for (int i=2; i < c.length; i++)
+                    func += c[i];
+                func += ";\n";
+
+                shell.transaction(JS.fromReader(
+                    "replace-transaction", 0, new StringReader(func)));
+
+            } catch (JSExn e) {
+                w.write("error: cannot replace '");
+                w.write(c[1]);
+                w.write("': ");
+                w.write(e.getMessage());
+                w.write("\n");
+            } catch (Shell.BadPathException e) {
+                w.write("error: cannot replace '");
+                w.write(c[1]);
+                w.write("': ");
+                w.write(e.getMessage() == null ? "no such path" : e.getMessage());
+                w.write("\n");
+            }
+        }
+    }
+
+    public static class Mkdir extends Command {
+        public Mkdir(Shell s) { super(s); }
+        public String name() { return "mkdir"; }
+        public String params() { return "[path]"; }
+        public String summary() { return "Creates a new object ready to handle keys."; }
+        public String help() { return
+            "Creates a new object ready to handle keys. This function " +
+            "is similar to calling replace [path] {}, only it will not " +
+            "overwrite an existing key.";
+        }
+        public void execute(Writer w, String[] c) throws IOException {
+            if (c.length != 2) { usage(w); return; }
+            try {
+                List path = fromShellPath(c[1]);
+                Object key = path.remove(path.size() - 1);
+                Object po = shell.getFromPath(path.toArray());
+
+                if (po == null || !(po instanceof JS))
+                    throw new Shell.BadPathException();
+
+                JS parent = (JS)po;
+                if (parent.containsKey(key))
+                    throw new Shell.BadPathException("already exists");
+
+                String func = "prevalent.";
+                for (int i=0; i < path.size(); i++)
+                    func += path.get(i) + ".";
+                func += key + " = {};\n";
+
+                shell.transaction(JS.fromReader(
+                    "mkdir-transaction", 0, new StringReader(func)));
+
+            } catch (JSExn e) {
+                w.write("error: cannot create '");
+                w.write(c[1]);
+                w.write("': ");
+                w.write(e.getMessage());
+                w.write("\n");
+            } catch (Shell.BadPathException e) {
+                w.write("error: cannot create '");
+                w.write(c[1]);
+                w.write("': ");
+                w.write(e.getMessage() == null ? "no such path" : e.getMessage());
+                w.write("\n");
+            }
+        }
+    }
+
     public static class Rm extends Command {
         public Rm(Shell s) { super(s); }
         public String name() { return "rm"; }
         public String params() { return "[options] [path]"; }
         public String summary() { return "Removes objects."; }
-        public String help() { return "Removes objects."; } // FIXME info
+        public String help() { return
+            "Removes objects. If any one of the specified paths does " +
+            "not exist, the entire remove process is cancelled."; }
         public void execute(Writer w, String[] c) throws IOException {
             if (c.length == 1) { usage(w); return; }