about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/nix/search.cc40
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));
+                        }
                     }
                 }