private async Task <InstallResult> InstallAsync(List <TemplatePackageData> packages, InstallRequest installRequest, IInstaller installer, CancellationToken cancellationToken) { _ = installRequest ?? throw new ArgumentNullException(nameof(installRequest)); _ = installer ?? throw new ArgumentNullException(nameof(installer)); (InstallerErrorCode result, string message) = await EnsureInstallPrerequisites( packages, installRequest.PackageIdentifier, installRequest.Version, installer, cancellationToken, forceUpdate : installRequest.Force).ConfigureAwait(false); if (result != InstallerErrorCode.Success) { return(InstallResult.CreateFailure(installRequest, result, message)); } InstallResult installResult = await installer.InstallAsync(installRequest, this, cancellationToken).ConfigureAwait(false); if (!installResult.Success) { return(installResult); } if (installResult.TemplatePackage is null) { throw new InvalidOperationException($"{nameof(installResult.TemplatePackage)} cannot be null when {nameof(installResult.Success)} is 'true'"); } lock (packages) { packages.Add(((ISerializableInstaller)installer).Serialize(installResult.TemplatePackage)); } return(installResult); }