diff options
| author | dan-shaw <51385773+dan-shaw@users.noreply.github.com> | 2020-07-17 15:52:19 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-17 15:52:19 -0700 |
| commit | 751fc627ef4f1c319b04e1c364e24b4da965e273 (patch) | |
| tree | 00fad8470ce4a855411ac7f8896cccaccd66ea32 /toolsrc/src | |
| parent | 273b5eddaa2d38b7df285efe915a0ce0ba12b7c5 (diff) | |
| download | vcpkg-751fc627ef4f1c319b04e1c364e24b4da965e273.tar.gz vcpkg-751fc627ef4f1c319b04e1c364e24b4da965e273.zip | |
[vcpkg] print list in json (#12179)
* print list command in json
* fix spacing
* remove reference
* review
* fixes based on review
Diffstat (limited to 'toolsrc/src')
| -rw-r--r-- | toolsrc/src/vcpkg/commands.list.cpp | 67 |
1 files changed, 54 insertions, 13 deletions
diff --git a/toolsrc/src/vcpkg/commands.list.cpp b/toolsrc/src/vcpkg/commands.list.cpp index cb57e056f..f65ba9497 100644 --- a/toolsrc/src/vcpkg/commands.list.cpp +++ b/toolsrc/src/vcpkg/commands.list.cpp @@ -11,6 +11,46 @@ namespace vcpkg::Commands::List { static constexpr StringLiteral OPTION_FULLDESC = "x-full-desc"; // TODO: This should find a better home, eventually + static constexpr StringLiteral OPTION_JSON = "--x-json"; + + static void do_print_json(std::vector<const vcpkg::StatusParagraph*> installed_packages) + { + Json::Object obj; + for (const StatusParagraph* status_paragraph : installed_packages) + { + auto current_spec = status_paragraph->package.spec; + if (obj.contains(current_spec.to_string())) + { + if (status_paragraph->package.is_feature()) + { + Json::Value* value_obj = obj.get(current_spec.to_string()); + auto& feature_list = value_obj->object()["features"].array(); + feature_list.push_back(Json::Value::string(status_paragraph->package.feature)); + } + } + else + { + Json::Object& library_obj = obj.insert(current_spec.to_string(), Json::Object()); + library_obj.insert("package_name", Json::Value::string(current_spec.name())); + library_obj.insert("triplet", Json::Value::string(current_spec.triplet().to_string())); + library_obj.insert("version", Json::Value::string(status_paragraph->package.version)); + library_obj.insert("port_version", Json::Value::integer(status_paragraph->package.port_version)); + Json::Array& features_array = library_obj.insert("features", Json::Array()); + if (status_paragraph->package.is_feature()) + { + features_array.push_back(Json::Value::string(status_paragraph->package.feature)); + } + Json::Array& desc = library_obj.insert("desc", Json::Array()); + for (const auto& line : status_paragraph->package.description) + { + desc.push_back(Json::Value::string(line)); + } + } + } + + System::print2(Json::stringify(obj, Json::JsonStyle{})); + } + static void do_print(const StatusParagraph& pgh, const bool full_desc) { auto full_version = VersionT(pgh.package.version, pgh.package.port_version).to_string(); @@ -35,8 +75,9 @@ namespace vcpkg::Commands::List } } - static constexpr std::array<CommandSwitch, 1> LIST_SWITCHES = {{ + static constexpr std::array<CommandSwitch, 2> LIST_SWITCHES = {{ {OPTION_FULLDESC, "Do not truncate long text"}, + {OPTION_JSON, "List libraries in JSON format"}, }}; const CommandStructure COMMAND_STRUCTURE = { @@ -74,25 +115,25 @@ namespace vcpkg::Commands::List }); const auto enable_fulldesc = Util::Sets::contains(options.switches, OPTION_FULLDESC.to_string()); + const auto enable_json = Util::Sets::contains(options.switches, OPTION_JSON.to_string()); - if (args.command_arguments.empty()) + if (!args.command_arguments.empty()) { - for (const StatusParagraph* status_paragraph : installed_packages) - { - do_print(*status_paragraph, enable_fulldesc); - } + auto& query = args.command_arguments[0]; + auto pghs = Util::filter(installed_packages, [query](const StatusParagraph* status_paragraph) { + return Strings::case_insensitive_ascii_contains(status_paragraph->package.displayname(), query); + }); + installed_packages = pghs; + } + + if (enable_json) + { + do_print_json(installed_packages); } else { - // At this point there is 1 argument for (const StatusParagraph* status_paragraph : installed_packages) { - const std::string displayname = status_paragraph->package.displayname(); - if (!Strings::case_insensitive_ascii_contains(displayname, args.command_arguments[0])) - { - continue; - } - do_print(*status_paragraph, enable_fulldesc); } } |
