* `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

@ -2,7 +2,8 @@ lib_LTLIBRARIES = libutil.la
libutil_la_SOURCES = util.cc util.hh hash.cc hash.hh \ libutil_la_SOURCES = util.cc util.hh hash.cc hash.hh \
archive.cc archive.hh aterm.cc aterm.hh \ archive.cc archive.hh aterm.cc aterm.hh \
aterm-map.cc aterm-map.hh aterm-map.cc aterm-map.hh \
xml-writer.cc xml-writer.hh
if !HAVE_OPENSSL if !HAVE_OPENSSL
libutil_la_SOURCES += \ libutil_la_SOURCES += \

View File

@ -1,61 +1,6 @@
#include <iostream>
#include <string>
#include <list>
#include <map>
#include <assert.h> #include <assert.h>
using namespace std;
#include "xml-writer.hh"
typedef map<string, string> XMLAttrs;
class XMLWriter
{
private:
ostream & output;
bool closed;
list<string> pendingElems;
public:
XMLWriter(ostream & output);
~XMLWriter();
void close();
void openElement(const string & name,
const XMLAttrs & attrs = XMLAttrs());
void closeElement();
void writeShortElement(const string & name,
const XMLAttrs & attrs = XMLAttrs());
void writeCharData(const string & data);
private:
void writeAttrs(const XMLAttrs & attrs);
};
class XMLOpenElement
{
private:
XMLWriter & writer;
public:
XMLOpenElement(XMLWriter & writer, const string & name,
const XMLAttrs & attrs = XMLAttrs())
: writer(writer)
{
writer.openElement(name, attrs);
}
~XMLOpenElement()
{
writer.closeElement();
}
};
XMLWriter::XMLWriter(ostream & output) XMLWriter::XMLWriter(ostream & output)
@ -138,6 +83,7 @@ void XMLWriter::writeAttrs(const XMLAttrs & attrs)
} }
#if 0
int main(int argc, char * * argv) int main(int argc, char * * argv)
{ {
XMLWriter doc(cout); XMLWriter doc(cout);
@ -159,3 +105,4 @@ int main(int argc, char * * argv)
return 0; return 0;
} }
#endif

64
src/libutil/xml-writer.hh Normal file
View File

@ -0,0 +1,64 @@
#ifndef __XML_WRITER_H
#define __XML_WRITER_H
#include <iostream>
#include <string>
#include <list>
#include <map>
using namespace std;
typedef map<string, string> XMLAttrs;
class XMLWriter
{
private:
ostream & output;
bool closed;
list<string> pendingElems;
public:
XMLWriter(ostream & output);
~XMLWriter();
void close();
void openElement(const string & name,
const XMLAttrs & attrs = XMLAttrs());
void closeElement();
void writeShortElement(const string & name,
const XMLAttrs & attrs = XMLAttrs());
void writeCharData(const string & data);
private:
void writeAttrs(const XMLAttrs & attrs);
};
class XMLOpenElement
{
private:
XMLWriter & writer;
public:
XMLOpenElement(XMLWriter & writer, const string & name,
const XMLAttrs & attrs = XMLAttrs())
: writer(writer)
{
writer.openElement(name, attrs);
}
~XMLOpenElement()
{
writer.closeElement();
}
};
#endif /* !__XML_WRITER_H */

View File

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