winget-cli

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

ManifestYamlPopulator.h (7210B)


      1 // Copyright (c) Microsoft Corporation.
      2 // Licensed under the MIT License.
      3 #pragma once
      4 #include <winget/Manifest.h>
      5 #include <winget/ManifestValidation.h>
      6 #include <winget/Yaml.h>
      7 
      8 namespace AppInstaller::Manifest
      9 {
     10     // Add here new manifest pointer types.
     11     using VariantManifestPtr = std::variant<Agreement*, AppsAndFeaturesEntry*, Dependency*, DependencyList*, Documentation*, ExpectedReturnCode*, Icon*, InstallationMetadataInfo*, InstalledFile*, Manifest*, ManifestInstaller*, ManifestLocalization*, MarketsInfo*, NestedInstallerFile*, std::map<InstallerSwitchType, Utility::NormalizedString>*, AppInstaller::Authentication::AuthenticationInfo*, AppInstaller::Authentication::MicrosoftEntraIdAuthenticationInfo*>;
     12 
     13     struct ManifestYamlPopulator
     14     {
     15         static std::vector<ValidationError> PopulateManifest(
     16             YAML::Node& rootNode,
     17             Manifest& manifest,
     18             const ManifestVer& manifestVersion,
     19             ManifestValidateOption validateOption,
     20             const std::optional<YAML::Node>& shadowNode);
     21 
     22     private:
     23 
     24         ManifestYamlPopulator(YAML::Node& rootNode, Manifest& manifest, const ManifestVer& manifestVersion, ManifestValidateOption validateOption);
     25 
     26         std::reference_wrapper<YAML::Node> m_rootNode;
     27         std::reference_wrapper<Manifest> m_manifest;
     28         std::reference_wrapper<const ManifestVer> m_manifestVersion;
     29         bool m_isMergedManifest = false;
     30         ManifestValidateOption m_validateOption;
     31 
     32         // Struct mapping a manifest field to its population logic
     33         struct FieldProcessInfo
     34         {
     35             FieldProcessInfo(std::string name, std::function<std::vector<ValidationError>(const YAML::Node&, const VariantManifestPtr& v)> func, bool requireVerifiedPublisher = false) :
     36                 Name(std::move(name)), ProcessFunc(func), RequireVerifiedPublisher(requireVerifiedPublisher) {}
     37 
     38             std::string Name;
     39             std::function<std::vector<ValidationError>(const YAML::Node&, const VariantManifestPtr& v)> ProcessFunc;
     40             bool RequireVerifiedPublisher = false;
     41         };
     42 
     43         std::vector<FieldProcessInfo> RootFieldInfos;
     44         std::vector<FieldProcessInfo> InstallerFieldInfos;
     45         std::vector<FieldProcessInfo> SwitchesFieldInfos;
     46         std::vector<FieldProcessInfo> ExpectedReturnCodesFieldInfos;
     47         std::vector<FieldProcessInfo> DependenciesFieldInfos;
     48         std::vector<FieldProcessInfo> PackageDependenciesFieldInfos;
     49         std::vector<FieldProcessInfo> LocalizationFieldInfos;
     50         std::vector<FieldProcessInfo> AgreementFieldInfos;
     51         std::vector<FieldProcessInfo> MarketsFieldInfos;
     52         std::vector<FieldProcessInfo> AppsAndFeaturesEntryFieldInfos;
     53         std::vector<FieldProcessInfo> DocumentationFieldInfos;
     54         std::vector<FieldProcessInfo> IconFieldInfos;
     55         std::vector<FieldProcessInfo> NestedInstallerFileFieldInfos;
     56         std::vector<FieldProcessInfo> InstallationMetadataFieldInfos;
     57         std::vector<FieldProcessInfo> InstallationMetadataFilesFieldInfos;
     58         std::vector<FieldProcessInfo> AuthenticationFieldInfos;
     59         std::vector<FieldProcessInfo> MicrosoftEntraIdAuthenticationInfoFieldInfos;
     60 
     61         // Cache of Installers node and Localization node
     62         YAML::Node const* m_p_installersNode = nullptr;
     63         YAML::Node const* m_p_localizationsNode = nullptr;
     64 
     65         std::vector<FieldProcessInfo> GetRootFieldProcessInfo();
     66         std::vector<FieldProcessInfo> GetInstallerFieldProcessInfo(bool forRootFields = false);
     67         std::vector<FieldProcessInfo> GetSwitchesFieldProcessInfo();
     68         std::vector<FieldProcessInfo> GetExpectedReturnCodesFieldProcessInfo();
     69         std::vector<FieldProcessInfo> GetDependenciesFieldProcessInfo();
     70         std::vector<FieldProcessInfo> GetPackageDependenciesFieldProcessInfo();
     71         std::vector<FieldProcessInfo> GetLocalizationFieldProcessInfo(bool forRootFields = false);
     72         std::vector<FieldProcessInfo> GetAgreementFieldProcessInfo();
     73         std::vector<FieldProcessInfo> GetMarketsFieldProcessInfo();
     74         std::vector<FieldProcessInfo> GetAppsAndFeaturesEntryFieldProcessInfo();
     75         std::vector<FieldProcessInfo> GetDocumentationFieldProcessInfo();
     76         std::vector<FieldProcessInfo> GetIconFieldProcessInfo();
     77         std::vector<FieldProcessInfo> GetNestedInstallerFileFieldProcessInfo();
     78         std::vector<FieldProcessInfo> GetInstallationMetadataFieldProcessInfo();
     79         std::vector<FieldProcessInfo> GetInstallationMetadataFilesFieldProcessInfo();
     80         std::vector<FieldProcessInfo> GetAuthenticationFieldInfos();
     81         std::vector<FieldProcessInfo> GetMicrosoftEntraIdAuthenticationInfoFieldInfos();
     82 
     83         // Shadow
     84         std::vector<FieldProcessInfo> GetShadowRootFieldProcessInfo();
     85         std::vector<FieldProcessInfo> GetShadowLocalizationFieldProcessInfo();
     86 
     87         // This method takes YAML root node and list of manifest field info.
     88         // Yaml lib does not support case-insensitive search and it allows duplicate keys. If duplicate keys exist,
     89         // the value is undefined. So in this method, we will iterate through the node map and process each individual
     90         // pair ourselves. This also helps with generating aggregated error rather than throwing on first failure.
     91         std::vector<ValidationError> ValidateAndProcessFields(
     92             const YAML::Node& rootNode,
     93             const std::vector<FieldProcessInfo>& fieldInfos,
     94             const VariantManifestPtr& v);
     95 
     96         std::vector<ValidationError> ProcessPackageDependenciesNode(const YAML::Node& rootNode, DependencyList* dependencyList);
     97         std::vector<ValidationError> ProcessAgreementsNode(const YAML::Node& agreementsNode, ManifestLocalization* localization);
     98         std::vector<ValidationError> ProcessMarketsNode(const YAML::Node& marketsNode, AppInstaller::Manifest::ManifestInstaller* installer);
     99         std::vector<ValidationError> ProcessAppsAndFeaturesEntriesNode(const YAML::Node& appsAndFeaturesEntriesNode, AppInstaller::Manifest::ManifestInstaller* installer);
    100         std::vector<ValidationError> ProcessExpectedReturnCodesNode(const YAML::Node& returnCodesNode, AppInstaller::Manifest::ManifestInstaller* installer);
    101         std::vector<ValidationError> ProcessDocumentationsNode(const YAML::Node& documentationsNode, ManifestLocalization* localization);
    102         std::vector<ValidationError> ProcessIconsNode(const YAML::Node& iconsNode, ManifestLocalization* localization);
    103         std::vector<ValidationError> ProcessNestedInstallerFilesNode(const YAML::Node& nestedInstallerFilesNode, AppInstaller::Manifest::ManifestInstaller* installer);
    104         std::vector<ValidationError> ProcessInstallationMetadataFilesNode(const YAML::Node& installedFilesNode, InstallationMetadataInfo* installationMetadata);
    105         std::vector<ValidationError> ProcessShadowLocalizationNode(const YAML::Node& localizationNode, Manifest* manifest);
    106 
    107         std::vector<ValidationError> PopulateManifestInternal();
    108         std::vector<ValidationError> InsertShadow(const YAML::Node& shadowNode);
    109     };
    110 }