winget-cli

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

ManifestJSONParser.cpp (4486B)


      1 // Copyright (c) Microsoft Corporation.
      2 // Licensed under the MIT License.
      3 #include "pch.h"
      4 #include "Public/winget/ManifestJSONParser.h"
      5 #include "Rest/Schema/1_0/Json/ManifestDeserializer.h"
      6 #include "Rest/Schema/1_1/Json/ManifestDeserializer.h"
      7 #include "Rest/Schema/1_4/Json/ManifestDeserializer.h"
      8 #include "Rest/Schema/1_5/Json/ManifestDeserializer.h"
      9 #include "Rest/Schema/1_6/Json/ManifestDeserializer.h"
     10 #include "Rest/Schema/1_7/Json/ManifestDeserializer.h"
     11 #include "Rest/Schema/1_9/Json/ManifestDeserializer.h"
     12 #include "Rest/Schema/1_10/Json/ManifestDeserializer.h"
     13 #include "Rest/Schema/1_12/Json/ManifestDeserializer.h"
     14 
     15 namespace AppInstaller::Repository::JSON
     16 {
     17     struct ManifestJSONParser::impl
     18     {
     19         // The deserializer.  We only have one lineage (1.0+) right now.
     20         std::unique_ptr<Rest::Schema::V1_0::Json::ManifestDeserializer> m_deserializer;
     21     };
     22 
     23     ManifestJSONParser::ManifestJSONParser(const Utility::Version& responseSchemaVersion)
     24     {
     25         const auto& parts = responseSchemaVersion.GetParts();
     26         THROW_HR_IF(E_INVALIDARG, parts.empty());
     27 
     28         m_pImpl = std::make_unique<impl>();
     29 
     30         if (parts[0].Integer == 1)
     31         {
     32             if (parts.size() == 1 || parts[1].Integer == 0)
     33             {
     34                 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_0::Json::ManifestDeserializer>();
     35             }
     36             else if (parts.size() > 1 && parts[1].Integer < 4)
     37             {
     38                 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_1::Json::ManifestDeserializer>();
     39             }
     40             else if (parts.size() > 1 && parts[1].Integer < 5)
     41             {
     42                 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_4::Json::ManifestDeserializer>();
     43             }
     44             else if (parts.size() > 1 && parts[1].Integer < 6)
     45             {
     46                 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_5::Json::ManifestDeserializer>();
     47             }
     48             else if (parts.size() > 1 && parts[1].Integer < 7)
     49             {
     50                 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_6::Json::ManifestDeserializer>();
     51             }
     52             else if (parts.size() > 1 && parts[1].Integer < 9)
     53             {
     54                 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_7::Json::ManifestDeserializer>();
     55             }
     56             else if (parts.size() > 1 && parts[1].Integer < 10)
     57             {
     58                 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_9::Json::ManifestDeserializer>();
     59             }
     60             else if (parts.size() > 1 && parts[1].Integer < 12)
     61             {
     62                 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_10::Json::ManifestDeserializer>();
     63             }
     64             else
     65             {
     66                 m_pImpl->m_deserializer = std::make_unique<Rest::Schema::V1_12::Json::ManifestDeserializer>();
     67             }
     68         }
     69         else
     70         {
     71             THROW_HR(HRESULT_FROM_WIN32(ERROR_UNSUPPORTED_TYPE));
     72         }
     73     }
     74 
     75     ManifestJSONParser::ManifestJSONParser(ManifestJSONParser&&) noexcept = default;
     76     ManifestJSONParser& ManifestJSONParser::operator=(ManifestJSONParser&&) noexcept = default;
     77 
     78     ManifestJSONParser::~ManifestJSONParser() = default;
     79 
     80     std::vector<Manifest::Manifest> ManifestJSONParser::Deserialize(const web::json::value& response) const
     81     {
     82         return m_pImpl->m_deserializer->Deserialize(response);
     83     }
     84 
     85     std::vector<Manifest::Manifest> ManifestJSONParser::DeserializeData(const web::json::value& data) const
     86     {
     87         return m_pImpl->m_deserializer->DeserializeData(data);
     88     }
     89 
     90     std::vector<Manifest::AppsAndFeaturesEntry> ManifestJSONParser::DeserializeAppsAndFeaturesEntries(const web::json::array& data) const
     91     {
     92         return m_pImpl->m_deserializer->DeserializeAppsAndFeaturesEntries(data);
     93     }
     94 
     95     std::optional<Manifest::ManifestLocalization> ManifestJSONParser::DeserializeLocale(const web::json::value& locale) const
     96     {
     97         return m_pImpl->m_deserializer->DeserializeLocale(locale);
     98     }
     99 
    100     std::optional<Manifest::InstallationMetadataInfo> ManifestJSONParser::DeserializeInstallationMetadata(const web::json::value& installationMetadata) const
    101     {
    102         return m_pImpl->m_deserializer->DeserializeInstallationMetadata(installationMetadata);
    103     }
    104 }