aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-10-24 12:45:11 +0200
committerEelco Dolstra <edolstra@gmail.com>2017-10-24 12:58:34 +0200
commit0d59f1ca49c9f7f3b2edaadcf590360ec66a6257 (patch)
treea03d53d84fb61eb354e2634705d8a076f0c1c76d /src/libexpr
parent25f32625e2f2a3a1e1b3a3811da82f21c3a3b880 (diff)
nix: Respect -I, --arg, --argstr
Also, random cleanup to argument handling.
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/common-eval-args.cc57
-rw-r--r--src/libexpr/common-eval-args.hh26
-rw-r--r--src/libexpr/common-opts.cc67
-rw-r--r--src/libexpr/common-opts.hh20
4 files changed, 83 insertions, 87 deletions
diff --git a/src/libexpr/common-eval-args.cc b/src/libexpr/common-eval-args.cc
new file mode 100644
index 000000000..3e0c78f28
--- /dev/null
+++ b/src/libexpr/common-eval-args.cc
@@ -0,0 +1,57 @@
+#include "common-eval-args.hh"
+#include "shared.hh"
+#include "download.hh"
+#include "util.hh"
+#include "eval.hh"
+
+namespace nix {
+
+MixEvalArgs::MixEvalArgs()
+{
+ mkFlag()
+ .longName("arg")
+ .description("argument to be passed to Nix functions")
+ .labels({"name", "expr"})
+ .handler([&](std::vector<std::string> ss) { autoArgs[ss[0]] = 'E' + ss[1]; });
+
+ mkFlag()
+ .longName("argstr")
+ .description("string-valued argument to be passed to Nix functions")
+ .labels({"name", "string"})
+ .handler([&](std::vector<std::string> ss) { autoArgs[ss[0]] = 'S' + ss[1]; });
+
+ mkFlag()
+ .shortName('I')
+ .longName("include")
+ .description("add a path to the list of locations used to look up <...> file names")
+ .label("path")
+ .handler([&](std::string s) { searchPath.push_back(s); });
+}
+
+Bindings * MixEvalArgs::getAutoArgs(EvalState & state)
+{
+ Bindings * res = state.allocBindings(autoArgs.size());
+ for (auto & i : autoArgs) {
+ 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;
+}
+
+Path lookupFileArg(EvalState & state, string s)
+{
+ if (isUri(s))
+ return getDownloader()->downloadCached(state.store, s, true);
+ else 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);
+}
+
+}
diff --git a/src/libexpr/common-eval-args.hh b/src/libexpr/common-eval-args.hh
new file mode 100644
index 000000000..09fa406b2
--- /dev/null
+++ b/src/libexpr/common-eval-args.hh
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "args.hh"
+
+namespace nix {
+
+class Store;
+class EvalState;
+struct Bindings;
+
+struct MixEvalArgs : virtual Args
+{
+ MixEvalArgs();
+
+ Bindings * getAutoArgs(EvalState & state);
+
+ Strings searchPath;
+
+private:
+
+ std::map<std::string, std::string> autoArgs;
+};
+
+Path lookupFileArg(EvalState & state, string s);
+
+}
diff --git a/src/libexpr/common-opts.cc b/src/libexpr/common-opts.cc
deleted file mode 100644
index 6b31961d3..000000000
--- a/src/libexpr/common-opts.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-#include "common-opts.hh"
-#include "shared.hh"
-#include "download.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 (isUri(s))
- return getDownloader()->downloadCached(state.store, s, true);
- else 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);
-}
-
-
-}
diff --git a/src/libexpr/common-opts.hh b/src/libexpr/common-opts.hh
deleted file mode 100644
index cb2732d6f..000000000
--- a/src/libexpr/common-opts.hh
+++ /dev/null
@@ -1,20 +0,0 @@
-#pragma once
-
-#include "eval.hh"
-
-namespace nix {
-
-class Store;
-
-/* Some common option parsing between nix-env and nix-instantiate. */
-bool parseAutoArgs(Strings::iterator & i,
- const Strings::iterator & argsEnd, std::map<string, string> & res);
-
-Bindings * evalAutoArgs(EvalState & state, std::map<string, string> & in);
-
-bool parseSearchPathArg(Strings::iterator & i,
- const Strings::iterator & argsEnd, Strings & searchPath);
-
-Path lookupFileArg(EvalState & state, string s);
-
-}