about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-10-26T16·59+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-10-26T16·59+0000
commitee401afad81dc7759c66829372826f98268ae606 (patch)
tree427342ad19e6a33994a12c756b1bab8f4da6c775 /src
parent37d7abd69402f0e7a78d4d2f2d78996409a8563a (diff)
* Mode `--parse-only' to parse the input (on stdin, `-'), and print
  out the AST as an ATerm.
* Mode `--eval-only' to parse and evaluate the input, and print the
  resulting normal form as an ATerm.

Neither of these modes require store/DB write permission.

Diffstat (limited to 'src')
-rw-r--r--src/nix-instantiate/main.cc36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/nix-instantiate/main.cc b/src/nix-instantiate/main.cc
index 0a533d4c7751..e396be5ff2dc 100644
--- a/src/nix-instantiate/main.cc
+++ b/src/nix-instantiate/main.cc
@@ -15,17 +15,17 @@ void printHelp()
 }
 
 
-static Expr evalStdin(EvalState & state)
+static Expr evalStdin(EvalState & state, bool parseOnly)
 {
     startNest(nest, lvlTalkative, format("evaluating standard input"));
     string s, s2;
     while (getline(cin, s2)) s += s2 + "\n";
     Expr e = parseExprFromString(state, s, absPath("."));
-    return evalExpr(state, e);
+    return parseOnly ? e : evalExpr(state, e);
 }
 
 
-static void printNixExpr(EvalState & state, Expr e)
+static void printDrvPaths(EvalState & state, Expr e)
 {
     ATMatcher m;
     ATermList es;
@@ -45,14 +45,14 @@ static void printNixExpr(EvalState & state, Expr e)
             ATermMap drvMap;
             queryAllAttrs(e, drvMap);
             for (ATermIterator i(drvMap.keys()); i; ++i)
-                printNixExpr(state, evalExpr(state, drvMap.get(*i)));
+                printDrvPaths(state, evalExpr(state, drvMap.get(*i)));
             return;
         }
     }
 
     if (atMatch(m, e) >> "List" >> es) {
         for (ATermIterator i(es); i; ++i)
-            printNixExpr(state, evalExpr(state, *i));
+            printDrvPaths(state, evalExpr(state, *i));
         return;
     }
 
@@ -60,11 +60,22 @@ static void printNixExpr(EvalState & state, Expr e)
 }
 
 
+static void printResult(EvalState & state, Expr e, bool evalOnly)
+{
+    if (evalOnly)
+        cout << format("%1%\n") % e;
+    else
+        printDrvPaths(state, e);
+}
+
+
 void run(Strings args)
 {
     EvalState state;
     Strings files;
     bool readStdin = false;
+    bool evalOnly = false;
+    bool parseOnly = false;
 
     for (Strings::iterator it = args.begin();
          it != args.end(); )
@@ -73,6 +84,14 @@ void run(Strings args)
 
         if (arg == "-")
             readStdin = true;
+        else if (arg == "--eval-only") {
+            readOnlyMode = true;
+            evalOnly = true;
+        }
+        else if (arg == "--parse-only") {
+            readOnlyMode = true;
+            parseOnly = evalOnly = true;
+        }
         else if (arg[0] == '-')
             throw UsageError(format("unknown flag `%1%`") % arg);
         else
@@ -82,15 +101,16 @@ void run(Strings args)
     openDB();
 
     if (readStdin) {
-        Expr e = evalStdin(state);
-        printNixExpr(state, e);
+        Expr e = evalStdin(state, parseOnly);
+        printResult(state, e, evalOnly);
     }
 
     for (Strings::iterator it = files.begin();
          it != files.end(); it++)
     {
         Expr e = evalFile(state, absPath(*it));
-        printNixExpr(state, e);
+        /* !!! parseOnly ignored */
+        printResult(state, e, evalOnly);
     }
 
     printEvalStats(state);