about summary refs log tree commit diff
path: root/src/libexpr/common-opts.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr/common-opts.cc')
-rw-r--r--src/libexpr/common-opts.cc64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/libexpr/common-opts.cc b/src/libexpr/common-opts.cc
new file mode 100644
index 000000000000..c03d720bde82
--- /dev/null
+++ b/src/libexpr/common-opts.cc
@@ -0,0 +1,64 @@
+#include "common-opts.hh"
+#include "../libmain/shared.hh"
+#include "util.hh"
+
+
+namespace nix {
+
+
+bool parseAutoArgs(Strings::iterator & i,
+    const Strings::iterator & argsEnd, std::map<string, string> & res)
+{
+    string arg = *i;
+    if (arg != "--arg" && arg != "--argstr") return false;
+
+    UsageError error(format("‘%1%’ requires two arguments") % arg);
+
+    if (++i == argsEnd) throw error;
+    string name = *i;
+    if (++i == argsEnd) throw error;
+    string value = *i;
+
+    res[name] = (arg == "--arg" ? 'E' : 'S') + value;
+
+    return true;
+}
+
+
+Bindings * evalAutoArgs(EvalState & state, std::map<string, string> & in)
+{
+    Bindings * res = state.allocBindings(in.size());
+    for (auto & i : in) {
+        Value * v = state.allocValue();
+        if (i.second[0] == 'E')
+            state.mkThunk_(*v, state.parseExprFromString(string(i.second, 1), absPath(".")));
+        else
+            mkString(*v, string(i.second, 1));
+        res->push_back(Attr(state.symbols.create(i.first), v));
+    }
+    res->sort();
+    return res;
+}
+
+
+bool parseSearchPathArg(Strings::iterator & i,
+    const Strings::iterator & argsEnd, Strings & searchPath)
+{
+    if (*i != "-I") return false;
+    if (++i == argsEnd) throw UsageError("‘-I’ requires an argument");
+    searchPath.push_back(*i);
+    return true;
+}
+
+
+Path lookupFileArg(EvalState & state, string s)
+{
+    if (s.size() > 2 && s.at(0) == '<' && s.at(s.size() - 1) == '>') {
+        Path p = s.substr(1, s.size() - 2);
+        return state.findFile(p);
+    } else
+        return absPath(s);
+}
+
+
+}