winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

RepositorySearch.cpp (8868B)


      1 // Copyright (c) Microsoft Corporation.
      2 // Licensed under the MIT License.
      3 #include "pch.h"
      4 #include "Public/winget/RepositorySearch.h"
      5 
      6 using namespace AppInstaller::Settings;
      7 using namespace std::chrono_literals;
      8 
      9 namespace AppInstaller::Repository
     10 {
     11     namespace
     12     {
     13         std::string GetStringVectorMessage(const std::vector<std::string>& input)
     14         {
     15             std::string result;
     16             bool first = true;
     17             for (auto const& field : input)
     18             {
     19                 if (first)
     20                 {
     21                     result += field;
     22                     first = false;
     23                 }
     24                 else
     25                 {
     26                     result += ", " + field;
     27                 }
     28             }
     29             return result;
     30         }
     31     }
     32 
     33     bool SearchRequest::IsForEverything() const
     34     {
     35         return (!Query.has_value() && Inclusions.empty() && Filters.empty());
     36     }
     37 
     38     std::string SearchRequest::ToString() const
     39     {
     40         std::ostringstream result;
     41 
     42         result << "Query:";
     43         if (Query)
     44         {
     45             result << '\'' << Query.value().Value << "'[" << Repository::ToString(Query.value().Type) << ']';
     46         }
     47         else
     48         {
     49             result << "[none]";
     50         }
     51 
     52         for (const auto& include : Inclusions)
     53         {
     54             result << " Include:" << Repository::ToString(include.Field) << "='" << include.Value << "'";
     55             if (include.Additional)
     56             {
     57                 result << "+'" << include.Additional.value() << "'";
     58             }
     59             result << "[" << Repository::ToString(include.Type) << "]";
     60         }
     61 
     62         for (const auto& filter : Filters)
     63         {
     64             result << " Filter:" << Repository::ToString(filter.Field) << "='" << filter.Value << "'[" << Repository::ToString(filter.Type) << "]";
     65         }
     66 
     67         if (MaximumResults)
     68         {
     69             result << " Limit:" << MaximumResults;
     70         }
     71 
     72         return result.str();
     73     }
     74 
     75     std::string_view ToString(PackageVersionMetadata pvm)
     76     {
     77         switch (pvm)
     78         {
     79         case PackageVersionMetadata::InstalledType: return "InstalledType"sv;
     80         case PackageVersionMetadata::InstalledScope: return "InstalledScope"sv;
     81         case PackageVersionMetadata::InstalledLocation: return "InstalledLocation"sv;
     82         case PackageVersionMetadata::StandardUninstallCommand: return "StandardUninstallCommand"sv;
     83         case PackageVersionMetadata::SilentUninstallCommand: return "SilentUninstallCommand"sv;
     84         case PackageVersionMetadata::Publisher: return "Publisher"sv;
     85         case PackageVersionMetadata::InstalledLocale: return "InstalledLocale"sv;
     86         case PackageVersionMetadata::TrackingWriteTime: return "TrackingWriteTime"sv;
     87         case PackageVersionMetadata::InstalledArchitecture: return "InstalledArchitecture"sv;
     88         case PackageVersionMetadata::PinnedState: return "PinnedState"sv;
     89         case PackageVersionMetadata::UserIntentArchitecture: return "UserIntentArchitecture"sv;
     90         case PackageVersionMetadata::UserIntentLocale: return "UserIntentLocale"sv;
     91         default: return "Unknown"sv;
     92         }
     93     }
     94 
     95     bool PackageVersionKey::IsMatch(const PackageVersionKey& other) const
     96     {
     97         return
     98             ((other.SourceId.empty() || other.SourceId == SourceId) &&
     99              (other.Version.empty() || Utility::Version{ other.Version } == Utility::Version{ Version }) &&
    100              (other.Channel.empty() || Utility::ICUCaseInsensitiveEquals(other.Channel, Channel)));
    101     }
    102 
    103     bool PackageVersionKey::IsDefaultLatest() const
    104     {
    105         return Version.empty() && Channel.empty();
    106     }
    107 
    108     PackageVersionMultiProperty PackageMultiPropertyToPackageVersionMultiProperty(PackageMultiProperty property)
    109     {
    110         switch (property)
    111         {
    112         case PackageMultiProperty::PackageFamilyName: return PackageVersionMultiProperty::PackageFamilyName;
    113         case PackageMultiProperty::ProductCode: return PackageVersionMultiProperty::ProductCode;
    114         case PackageMultiProperty::UpgradeCode: return PackageVersionMultiProperty::UpgradeCode;
    115         case PackageMultiProperty::NormalizedName: return PackageVersionMultiProperty::Name;
    116         case PackageMultiProperty::NormalizedPublisher: return PackageVersionMultiProperty::Publisher;
    117         case PackageMultiProperty::Tag: return PackageVersionMultiProperty::Tag;
    118         case PackageMultiProperty::Command: return PackageVersionMultiProperty::Command;
    119         default:
    120             THROW_HR_MSG(E_UNEXPECTED, "PackageMultiProperty must map to a PackageVersionMultiProperty");
    121         }
    122     }
    123 
    124     const char* UnsupportedRequestException::what() const noexcept
    125     {
    126         if (m_whatMessage.empty())
    127         {
    128             m_whatMessage = "The request is not supported.";
    129 
    130             if (!UnsupportedPackageMatchFields.empty())
    131             {
    132                 m_whatMessage += "Unsupported Package Match Fields: " + GetStringVectorMessage(UnsupportedPackageMatchFields);
    133             }
    134             if (!RequiredPackageMatchFields.empty())
    135             {
    136                 m_whatMessage += "Required Package Match Fields: " + GetStringVectorMessage(RequiredPackageMatchFields);
    137             }
    138             if (!UnsupportedQueryParameters.empty())
    139             {
    140                 m_whatMessage += "Unsupported Query Parameters: " + GetStringVectorMessage(UnsupportedQueryParameters);
    141             }
    142             if (!RequiredQueryParameters.empty())
    143             {
    144                 m_whatMessage += "Required Query Parameters: " + GetStringVectorMessage(RequiredQueryParameters);
    145             }
    146         }
    147         return m_whatMessage.c_str();
    148     }
    149 
    150     std::string_view ToString(MatchType type)
    151     {
    152         using namespace std::string_view_literals;
    153 
    154         switch (type)
    155         {
    156         case MatchType::Exact:
    157             return "Exact"sv;
    158         case MatchType::CaseInsensitive:
    159             return "CaseInsensitive"sv;
    160         case MatchType::StartsWith:
    161             return "StartsWith"sv;
    162         case MatchType::Substring:
    163             return "Substring"sv;
    164         case MatchType::Wildcard:
    165             return "Wildcard"sv;
    166         case MatchType::Fuzzy:
    167             return "Fuzzy"sv;
    168         case MatchType::FuzzySubstring:
    169             return "FuzzySubstring"sv;
    170         }
    171 
    172         return "UnknownMatchType"sv;
    173     }
    174 
    175     std::string_view ToString(PackageMatchField matchField)
    176     {
    177         using namespace std::string_view_literals;
    178 
    179         switch (matchField)
    180         {
    181         case PackageMatchField::Command:
    182             return "Command"sv;
    183         case PackageMatchField::Id:
    184             return "Id"sv;
    185         case PackageMatchField::Moniker:
    186             return "Moniker"sv;
    187         case PackageMatchField::Name:
    188             return "Name"sv;
    189         case PackageMatchField::Tag:
    190             return "Tag"sv;
    191         case PackageMatchField::PackageFamilyName:
    192             return "PackageFamilyName"sv;
    193         case PackageMatchField::ProductCode:
    194             return "ProductCode"sv;
    195         case PackageMatchField::UpgradeCode:
    196             return "UpgradeCode"sv;
    197         case PackageMatchField::NormalizedNameAndPublisher:
    198             return "NormalizedNameAndPublisher"sv;
    199         case PackageMatchField::Market:
    200             return "Market"sv;
    201         }
    202 
    203         return "UnknownMatchField"sv;
    204     }
    205 
    206     PackageMatchField StringToPackageMatchField(std::string_view field)
    207     {
    208         std::string toLower = Utility::ToLower(field);
    209 
    210         if (toLower == "command")
    211         {
    212             return PackageMatchField::Command;
    213         }
    214         else if (toLower == "id")
    215         {
    216             return PackageMatchField::Id;
    217         }
    218         else if (toLower == "moniker")
    219         {
    220             return PackageMatchField::Moniker;
    221         }
    222         else if (toLower == "name")
    223         {
    224             return PackageMatchField::Name;
    225         }
    226         else if (toLower == "tag")
    227         {
    228             return PackageMatchField::Tag;
    229         }
    230         else if (toLower == "packagefamilyname")
    231         {
    232             return PackageMatchField::PackageFamilyName;
    233         }
    234         else if (toLower == "productcode")
    235         {
    236             return PackageMatchField::ProductCode;
    237         }
    238         else if (toLower == "upgradecode")
    239         {
    240             return PackageMatchField::UpgradeCode;
    241         }
    242         else if (toLower == "normalizednameandpublisher")
    243         {
    244             return PackageMatchField::NormalizedNameAndPublisher;
    245         }
    246         else if (toLower == "market")
    247         {
    248             return PackageMatchField::Market;
    249         }
    250 
    251         return PackageMatchField::Unknown;
    252     }
    253 }