diff options
Diffstat (limited to 'third_party/nix/src/libexpr/common-eval-args.cc')
-rw-r--r-- | third_party/nix/src/libexpr/common-eval-args.cc | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/third_party/nix/src/libexpr/common-eval-args.cc b/third_party/nix/src/libexpr/common-eval-args.cc new file mode 100644 index 000000000000..f63d3f8276ec --- /dev/null +++ b/third_party/nix/src/libexpr/common-eval-args.cc @@ -0,0 +1,72 @@ +#include "libexpr/common-eval-args.hh" + +#include "libexpr/eval.hh" +#include "libmain/shared.hh" +#include "libstore/download.hh" +#include "libutil/util.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) { + auto_args_[ss[0]] = std::make_pair(kArgTypeExpr, ss[1]); + }); + + mkFlag() + .longName("argstr") + .description("string-valued argument to be passed to Nix functions") + .labels({"name", "string"}) + .handler([&](std::vector<std::string> ss) { + auto_args_[ss[0]] = std::make_pair(kArgTypeString, 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([&](const std::string& s) { searchPath.push_back(s); }); +} + +std::unique_ptr<Bindings> MixEvalArgs::getAutoArgs(EvalState& state) { + auto res = Bindings::New(auto_args_.size()); + for (auto& [arg, arg_value] : auto_args_) { + Value* v = state.allocValue(); + switch (arg_value.first) { + case kArgTypeExpr: { + state.mkThunk_( + *v, state.parseExprFromString(arg_value.second, absPath("."))); + break; + } + case kArgTypeString: { + mkString(*v, arg_value.second); + break; + } + } + + res->push_back(Attr(state.symbols.Create(arg), v)); + } + return res; +} + +Path lookupFileArg(EvalState& state, std::string s) { + if (isUri(s)) { + CachedDownloadRequest request(s); + request.unpack = true; + return getDownloader()->downloadCached(state.store, request).path; + } + 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); + } +} + +} // namespace nix |