nix search: Add --json flag

This commit is contained in:
Eelco Dolstra 2017-07-18 17:30:09 +02:00
parent 90825dea51
commit b144c4d617
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE

View file

@ -4,6 +4,8 @@
#include "eval-inline.hh"
#include "names.hh"
#include "get-drvs.hh"
#include "common-args.hh"
#include "json.hh"
#include <regex>
@ -19,7 +21,7 @@ std::string hilite(const std::string & s, const std::smatch & m)
+ std::string(m.suffix());
}
struct CmdSearch : SourceExprCommand
struct CmdSearch : SourceExprCommand, MixJSON
{
std::string re;
@ -50,6 +52,8 @@ struct CmdSearch : SourceExprCommand
bool first = true;
auto jsonOut = json ? std::make_unique<JSONObject>(std::cout, true) : nullptr;
doExpr = [&](Value * v, std::string attrPath, bool toplevel) {
debug("at attribute %s", attrPath);
@ -86,18 +90,28 @@ struct CmdSearch : SourceExprCommand
|| !nameMatch.empty()
|| !descriptionMatch.empty())
{
if (!first) std::cout << "\n";
first = false;
if (json) {
std::cout << fmt(
"Attribute name: %s\n"
"Package name: %s\n"
"Version: %s\n"
"Description: %s\n",
hilite(attrPath, attrPathMatch),
hilite(name, nameMatch),
parsed.version,
hilite(description, descriptionMatch));
auto jsonElem = jsonOut->object(attrPath);
jsonElem.attr("pkgName", parsed.name);
jsonElem.attr("version", parsed.version);
jsonElem.attr("description", description);
} else {
if (!first) std::cout << "\n";
first = false;
std::cout << fmt(
"Attribute name: %s\n"
"Package name: %s\n"
"Version: %s\n"
"Description: %s\n",
hilite(attrPath, attrPathMatch),
hilite(name, nameMatch),
parsed.version,
hilite(description, descriptionMatch));
}
}
}