about summary refs log tree commit diff
path: root/src/libexpr/main.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2003-11-19T11·35+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2003-11-19T11·35+0000
commitac68840e79ce74f05ee8b31bb1d528c98b9c7f76 (patch)
tree98e8251d0537197b1c3e53068529f1e5e3114fdc /src/libexpr/main.cc
parent2be8b5917a8040fac72e7970e94bbb436e8c35d6 (diff)
* Refactoring: put the Nix expression evaluator in its own library so
  that it can be used by multiple programs.

Diffstat (limited to 'src/libexpr/main.cc')
-rw-r--r--src/libexpr/main.cc117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/libexpr/main.cc b/src/libexpr/main.cc
new file mode 100644
index 000000000000..aa6883ff84b8
--- /dev/null
+++ b/src/libexpr/main.cc
@@ -0,0 +1,117 @@
+#include <map>
+#include <iostream>
+
+#include "globals.hh"
+#include "normalise.hh"
+#include "shared.hh"
+#include "eval.hh"
+
+
+#if 0
+static Path searchPath(const Paths & searchDirs, const Path & relPath)
+{
+    if (string(relPath, 0, 1) == "/") return relPath;
+
+    for (Paths::const_iterator i = searchDirs.begin();
+         i != searchDirs.end(); i++)
+    {
+        Path path = *i + "/" + relPath;
+        if (pathExists(path)) return path;
+    }
+
+    throw Error(
+        format("path `%1%' not found in any of the search directories")
+        % relPath);
+}
+#endif
+
+
+static Expr evalStdin(EvalState & state)
+{
+    startNest(nest, lvlTalkative, format("evaluating standard input"));
+    Expr e = ATreadFromFile(stdin);
+    if (!e) 
+        throw Error(format("unable to read a term from stdin"));
+    return evalExpr(state, e);
+}
+
+
+static void printNixExpr(EvalState & state, Expr e)
+{
+    ATMatcher m;
+    ATermList es;
+
+    if (atMatch(m, e) >> "Attrs" >> es) {
+        Expr a = queryAttr(e, "type");
+        if (a && evalString(state, a) == "derivation") {
+            a = queryAttr(e, "drvPath");
+            if (a) {
+                cout << format("%1%\n") % evalPath(state, a);
+                return;
+            }
+        }
+    }
+
+    if (ATgetType(e) == AT_LIST) {
+        for (ATermIterator i((ATermList) e); i; ++i)
+            printNixExpr(state, evalExpr(state, *i));
+        return;
+    }
+
+    throw badTerm("top level does not evaluate to one or more Nix expressions", e);
+}
+
+
+void run(Strings args)
+{
+    EvalState state;
+    Strings files;
+    bool readStdin = false;
+
+#if 0
+    state.searchDirs.push_back(".");
+    state.searchDirs.push_back(nixDataDir + "/nix");
+#endif
+    
+    for (Strings::iterator it = args.begin();
+         it != args.end(); )
+    {
+        string arg = *it++;
+
+#if 0
+        if (arg == "--includedir" || arg == "-I") {
+            if (it == args.end())
+                throw UsageError(format("argument required in `%1%'") % arg);
+            state.searchDirs.push_back(*it++);
+        }
+        else
+#endif
+        if (arg == "--verbose" || arg == "-v")
+            verbosity = (Verbosity) ((int) verbosity + 1);
+        else if (arg == "-")
+            readStdin = true;
+        else if (arg[0] == '-')
+            throw UsageError(format("unknown flag `%1%`") % arg);
+        else
+            files.push_back(arg);
+    }
+
+    openDB();
+
+    if (readStdin) {
+        Expr e = evalStdin(state);
+        printNixExpr(state, e);
+    }
+
+    for (Strings::iterator it = files.begin();
+         it != files.end(); it++)
+    {
+        Expr e = evalFile(state, absPath(*it));
+        printNixExpr(state, e);
+    }
+
+    printEvalStats(state);
+}
+
+
+string programId = "nix-instantiate";