aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/common-eval-args.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr/common-eval-args.cc')
-rw-r--r--src/libexpr/common-eval-args.cc57
1 files changed, 57 insertions, 0 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);
+}
+
+}