From b144c4d61738b9d9e3d741e77066a2be115f0ab5 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 18 Jul 2017 17:30:09 +0200 Subject: [PATCH] nix search: Add --json flag --- src/nix/search.cc | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/nix/search.cc b/src/nix/search.cc index 813f6d0a6..8aac06ad2 100644 --- a/src/nix/search.cc +++ b/src/nix/search.cc @@ -4,6 +4,8 @@ #include "eval-inline.hh" #include "names.hh" #include "get-drvs.hh" +#include "common-args.hh" +#include "json.hh" #include @@ -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(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)); + } } }