Add --json argument to nix-instantiate

This commit is contained in:
Paul Colomiets 2014-06-24 00:30:22 +03:00 committed by Eelco Dolstra
parent 8504e7d604
commit 858b8f9760
2 changed files with 26 additions and 6 deletions

View file

@ -124,6 +124,15 @@ input.</para>
</varlistentry> </varlistentry>
<varlistentry><term><option>--json</option></term>
<listitem><para>When used with <option>--parse</option> and
<option>--eval</option>, print the resulting expression as an
JSON representation of the abstract syntax tree rather than as an
ATerm.</para></listitem>
</varlistentry>
<varlistentry><term><option>--strict</option></term> <varlistentry><term><option>--strict</option></term>
<listitem><para>When used with <option>--eval</option>, <listitem><para>When used with <option>--eval</option>,

View file

@ -5,6 +5,7 @@
#include "get-drvs.hh" #include "get-drvs.hh"
#include "attr-path.hh" #include "attr-path.hh"
#include "value-to-xml.hh" #include "value-to-xml.hh"
#include "value-to-json.hh"
#include "util.hh" #include "util.hh"
#include "store-api.hh" #include "store-api.hh"
#include "common-opts.hh" #include "common-opts.hh"
@ -13,6 +14,12 @@
#include <map> #include <map>
#include <iostream> #include <iostream>
enum OutputKind {
OUTPUT_PLAIN,
OUTPUT_XML,
OUTPUT_JSON,
};
using namespace nix; using namespace nix;
@ -37,7 +44,7 @@ static bool indirectRoot = false;
void processExpr(EvalState & state, const Strings & attrPaths, void processExpr(EvalState & state, const Strings & attrPaths,
bool parseOnly, bool strict, Bindings & autoArgs, bool parseOnly, bool strict, Bindings & autoArgs,
bool evalOnly, bool xmlOutput, bool location, Expr * e) bool evalOnly, OutputKind output, bool location, Expr * e)
{ {
if (parseOnly) { if (parseOnly) {
std::cout << format("%1%\n") % *e; std::cout << format("%1%\n") % *e;
@ -58,8 +65,10 @@ void processExpr(EvalState & state, const Strings & attrPaths,
vRes = v; vRes = v;
else else
state.autoCallFunction(autoArgs, v, vRes); state.autoCallFunction(autoArgs, v, vRes);
if (xmlOutput) if (output == OUTPUT_XML)
printValueAsXML(state, strict, location, vRes, std::cout, context); printValueAsXML(state, strict, location, vRes, std::cout, context);
else if (output == OUTPUT_JSON)
printValueAsJSON(state, strict, vRes, std::cout, context);
else { else {
if (strict) state.strictForceValue(vRes); if (strict) state.strictForceValue(vRes);
std::cout << vRes << std::endl; std::cout << vRes << std::endl;
@ -108,7 +117,7 @@ void run(Strings args)
bool findFile = false; bool findFile = false;
bool evalOnly = false; bool evalOnly = false;
bool parseOnly = false; bool parseOnly = false;
bool xmlOutput = false; OutputKind outputKind = OUTPUT_PLAIN;
bool xmlOutputSourceLocation = true; bool xmlOutputSourceLocation = true;
bool strict = false; bool strict = false;
Strings attrPaths; Strings attrPaths;
@ -145,7 +154,9 @@ void run(Strings args)
else if (arg == "--indirect") else if (arg == "--indirect")
indirectRoot = true; indirectRoot = true;
else if (arg == "--xml") else if (arg == "--xml")
xmlOutput = true; outputKind = OUTPUT_XML;
else if (arg == "--json")
outputKind = OUTPUT_JSON;
else if (arg == "--no-location") else if (arg == "--no-location")
xmlOutputSourceLocation = false; xmlOutputSourceLocation = false;
else if (arg == "--strict") else if (arg == "--strict")
@ -179,7 +190,7 @@ void run(Strings args)
if (readStdin) { if (readStdin) {
Expr * e = parseStdin(state); Expr * e = parseStdin(state);
processExpr(state, attrPaths, parseOnly, strict, autoArgs, processExpr(state, attrPaths, parseOnly, strict, autoArgs,
evalOnly, xmlOutput, xmlOutputSourceLocation, e); evalOnly, outputKind, xmlOutputSourceLocation, e);
} else if (files.empty() && !fromArgs) } else if (files.empty() && !fromArgs)
files.push_back("./default.nix"); files.push_back("./default.nix");
@ -188,7 +199,7 @@ void run(Strings args)
? state.parseExprFromString(*i, absPath(".")) ? state.parseExprFromString(*i, absPath("."))
: state.parseExprFromFile(resolveExprPath(lookupFileArg(state, *i))); : state.parseExprFromFile(resolveExprPath(lookupFileArg(state, *i)));
processExpr(state, attrPaths, parseOnly, strict, autoArgs, processExpr(state, attrPaths, parseOnly, strict, autoArgs,
evalOnly, xmlOutput, xmlOutputSourceLocation, e); evalOnly, outputKind, xmlOutputSourceLocation, e);
} }
state.printStats(); state.printStats();