diff --git a/doc/manual/nix-instantiate.xml b/doc/manual/nix-instantiate.xml index b388560a1..936f154dd 100644 --- a/doc/manual/nix-instantiate.xml +++ b/doc/manual/nix-instantiate.xml @@ -124,6 +124,15 @@ input. + + + When used with and + , print the resulting expression as an + JSON representation of the abstract syntax tree rather than as an + ATerm. + + + When used with , diff --git a/src/nix-instantiate/nix-instantiate.cc b/src/nix-instantiate/nix-instantiate.cc index cdd74523c..7acc9d501 100644 --- a/src/nix-instantiate/nix-instantiate.cc +++ b/src/nix-instantiate/nix-instantiate.cc @@ -5,6 +5,7 @@ #include "get-drvs.hh" #include "attr-path.hh" #include "value-to-xml.hh" +#include "value-to-json.hh" #include "util.hh" #include "store-api.hh" #include "common-opts.hh" @@ -13,6 +14,12 @@ #include #include +enum OutputKind { + OUTPUT_PLAIN, + OUTPUT_XML, + OUTPUT_JSON, +}; + using namespace nix; @@ -37,7 +44,7 @@ static bool indirectRoot = false; void processExpr(EvalState & state, const Strings & attrPaths, bool parseOnly, bool strict, Bindings & autoArgs, - bool evalOnly, bool xmlOutput, bool location, Expr * e) + bool evalOnly, OutputKind output, bool location, Expr * e) { if (parseOnly) { std::cout << format("%1%\n") % *e; @@ -58,8 +65,10 @@ void processExpr(EvalState & state, const Strings & attrPaths, vRes = v; else state.autoCallFunction(autoArgs, v, vRes); - if (xmlOutput) + if (output == OUTPUT_XML) printValueAsXML(state, strict, location, vRes, std::cout, context); + else if (output == OUTPUT_JSON) + printValueAsJSON(state, strict, vRes, std::cout, context); else { if (strict) state.strictForceValue(vRes); std::cout << vRes << std::endl; @@ -108,7 +117,7 @@ void run(Strings args) bool findFile = false; bool evalOnly = false; bool parseOnly = false; - bool xmlOutput = false; + OutputKind outputKind = OUTPUT_PLAIN; bool xmlOutputSourceLocation = true; bool strict = false; Strings attrPaths; @@ -145,7 +154,9 @@ void run(Strings args) else if (arg == "--indirect") indirectRoot = true; else if (arg == "--xml") - xmlOutput = true; + outputKind = OUTPUT_XML; + else if (arg == "--json") + outputKind = OUTPUT_JSON; else if (arg == "--no-location") xmlOutputSourceLocation = false; else if (arg == "--strict") @@ -179,7 +190,7 @@ void run(Strings args) if (readStdin) { Expr * e = parseStdin(state); processExpr(state, attrPaths, parseOnly, strict, autoArgs, - evalOnly, xmlOutput, xmlOutputSourceLocation, e); + evalOnly, outputKind, xmlOutputSourceLocation, e); } else if (files.empty() && !fromArgs) files.push_back("./default.nix"); @@ -188,7 +199,7 @@ void run(Strings args) ? state.parseExprFromString(*i, absPath(".")) : state.parseExprFromFile(resolveExprPath(lookupFileArg(state, *i))); processExpr(state, attrPaths, parseOnly, strict, autoArgs, - evalOnly, xmlOutput, xmlOutputSourceLocation, e); + evalOnly, outputKind, xmlOutputSourceLocation, e); } state.printStats();