diff options
-rw-r--r-- | src/nix/search.cc | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/src/nix/search.cc b/src/nix/search.cc index 813f6d0a6226..8aac06ad2cd3 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 <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; - - 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)); + if (json) { + + 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)); + } } } |