diff options
Diffstat (limited to 'src/libexpr/common-opts.cc')
-rw-r--r-- | src/libexpr/common-opts.cc | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/libexpr/common-opts.cc b/src/libexpr/common-opts.cc new file mode 100644 index 000000000000..25f1e7117b76 --- /dev/null +++ b/src/libexpr/common-opts.cc @@ -0,0 +1,62 @@ +#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; +} + + +void evalAutoArgs(EvalState & state, std::map<string, string> & in, Bindings & out) +{ + 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)); + out.push_back(Attr(state.symbols.create(i.first), v)); + } + out.sort(); +} + + +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); +} + + +} |