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 }