* `nix-instantiate --print-args': produce XML output so that the

result can be used more easily by scripts.
This commit is contained in:
Eelco Dolstra 2006-08-03 14:49:57 +00:00
parent 4750f6c5ed
commit 0e267e2625
4 changed files with 81 additions and 60 deletions

View file

@ -10,6 +10,7 @@
#include "nixexpr-ast.hh"
#include "get-drvs.hh"
#include "attr-path.hh"
#include "xml-writer.hh"
#include "help.txt.hh"
@ -40,21 +41,29 @@ static void printResult(EvalState & state, Expr e,
cout << format("%1%\n") % e;
else if (printArgs) {
XMLWriter doc(cout);
XMLOpenElement root(doc, "args");
ATermList formals;
ATerm body, pos;
if (matchFunction(e, formals, body, pos)) {
for (ATermIterator i(formals); i; ++i) {
Expr name; ValidValues valids; ATerm dummy;
if (!matchFormal(*i, name, valids, dummy)) abort();
cout << format("%1%: ") % aterm2String(name);
XMLAttrs attrs;
attrs["name"] = aterm2String(name);
XMLOpenElement elem(doc, "arg", attrs);
ATermList valids2;
if (matchValidValues(valids, valids2)) {
for (ATermIterator j(valids2); j; ++j) {
Expr e = evalExpr(state, *j);
cout << format("%1% ") % showValue(e);
XMLOpenElement elem(doc, "value");
doc.writeCharData(showValue(e));
}
}
cout << format("\n");
}
} else
printMsg(lvlError, "warning: expression does not evaluate to a function");