/// <summary> /// Executes searching for the templates in configured remote sources. /// Performs validation for the commands, search for the templates in configured remote source, displays the results in table format /// </summary> /// <param name="environmentSettings">environment settings</param> /// <param name="commandInput">new command data</param> /// <param name="defaultLanguage">default language for the host</param> /// <returns><c>CreationResultStatus.Success</c> when the templates were found and displayed; /// <c>CreationResultStatus.Cancelled</c> when the command validation fails; /// <c>CreationResultStatus.NotFound</c> when no templates found based on the filter criteria. /// </returns> internal static async Task <CreationResultStatus> SearchForTemplateMatchesAsync(IEngineEnvironmentSettings environmentSettings, INewCommandInput commandInput, string defaultLanguage) { if (!ValidateCommandInput(commandInput)) { return(CreationResultStatus.Cancelled); } Reporter.Output.WriteLine(LocalizableStrings.SearchOnlineNotification); TemplateSearchCoordinator searchCoordinator = CliTemplateSearchCoordinatorFactory.CreateCliTemplateSearchCoordinator(environmentSettings, commandInput, defaultLanguage); SearchResults searchResults = await searchCoordinator.SearchAsync().ConfigureAwait(false); if (!searchResults.AnySources) { Reporter.Error.WriteLine(LocalizableStrings.SearchOnlineNoSources.Bold().Red()); return(CreationResultStatus.NotFound); } if (searchResults.MatchesBySource.Count > 0) { string packageIdToShow = null; foreach (TemplateSourceSearchResult sourceResult in searchResults.MatchesBySource) { DisplayResultsForPack(sourceResult, environmentSettings, commandInput, defaultLanguage); var firstMicrosoftAuthoredPack = sourceResult.PacksWithMatches.FirstOrDefault(p => p.Value.TemplateMatches.Any(t => string.Equals(t.Info.Author, "Microsoft"))); if (!firstMicrosoftAuthoredPack.Equals(default(KeyValuePair <PackInfo, TemplatePackSearchResult>))) { packageIdToShow = firstMicrosoftAuthoredPack.Key.Name; } } Reporter.Output.WriteLine(); Reporter.Output.WriteLine(string.Format(LocalizableStrings.SearchResultInstallHeader, commandInput.CommandName)); if (string.IsNullOrWhiteSpace(packageIdToShow)) { packageIdToShow = searchResults.MatchesBySource.First().PacksWithMatches.First().Key.Name; } Reporter.Output.WriteLine("Example:"); Reporter.Output.WriteLine(string.Format(LocalizableStrings.SearchResultInstallCommand, commandInput.CommandName, packageIdToShow)); return(CreationResultStatus.Success); } else { string filters = string.Join(", ", SupportedFilterOptions.SupportedSearchFilters.Where(filter => filter.IsFilterSet(commandInput)).Select(filter => $"{filter.Name}='{filter.FilterValue(commandInput)}'")); string searchCriteria = string.IsNullOrWhiteSpace(commandInput.TemplateName) ? filters : string.IsNullOrWhiteSpace(filters) ? commandInput.TemplateName : string.Join(", ", commandInput.TemplateName, filters); Reporter.Error.WriteLine(string.Format(LocalizableStrings.NoTemplatesMatchingInputParameters, searchCriteria).Bold().Red()); return(CreationResultStatus.NotFound); } }
/// <summary> /// Executes searching for the templates in configured remote sources. /// Performs validation for the commands, search for the templates in configured remote source, displays the results in table format. /// </summary> /// <param name="environmentSettings">environment settings.</param> /// <param name="templatePackageManager"></param> /// <param name="commandArgs">new command data.</param> /// <param name="defaultLanguage">default language for the host.</param> /// <param name="cancellationToken"></param> /// <returns><see cref="NewCommandStatus.Success"/> when the templates were found and displayed; /// <see cref="NewCommandStatus.MissingRequiredOption"/> when the command validation fails; /// <see cref="NewCommandStatus.NotFound"/> when no templates found based on the filter criteria. /// </returns> internal static async Task <NewCommandStatus> SearchForTemplateMatchesAsync( IEngineEnvironmentSettings environmentSettings, TemplatePackageManager templatePackageManager, SearchCommandArgs commandArgs, string?defaultLanguage, CancellationToken cancellationToken) { if (!ValidateCommandInput(commandArgs)) { return(NewCommandStatus.MissingRequiredOption); } Reporter.Output.WriteLine(LocalizableStrings.CliTemplateSearchCoordinator_Info_SearchInProgress); IReadOnlyList <IManagedTemplatePackage> templatePackages = await templatePackageManager.GetManagedTemplatePackagesAsync(force : false, cancellationToken : cancellationToken).ConfigureAwait(false); TemplateSearchCoordinator searchCoordinator = CliTemplateSearchCoordinatorFactory.CreateCliTemplateSearchCoordinator(environmentSettings); CliSearchFiltersFactory searchFiltersFactory = new CliSearchFiltersFactory(templatePackages); IReadOnlyList <SearchResult>?searchResults = await searchCoordinator.SearchAsync( searchFiltersFactory.GetPackFilter(commandArgs), CliSearchFiltersFactory.GetMatchingTemplatesFilter(commandArgs), cancellationToken).ConfigureAwait(false); if (!searchResults.Any()) { Reporter.Error.WriteLine(LocalizableStrings.CliTemplateSearchCoordinator_Error_NoSources.Bold().Red()); return(NewCommandStatus.NotFound); } foreach (SearchResult result in searchResults) { if (!result.Success) { Reporter.Error.WriteLine(string.Format(LocalizableStrings.CliTemplateSearchCoordinator_Info_MatchesFromSource, result.Provider.Factory.DisplayName)); Reporter.Error.WriteLine(string.Format(LocalizableStrings.CliTemplateSearchCoordinator_Error_SearchFailure, result.ErrorMessage).Red().Bold()); continue; } Reporter.Output.WriteLine(string.Format(LocalizableStrings.CliTemplateSearchCoordinator_Info_MatchesFromSource, result.Provider.Factory.DisplayName)); if (result.SearchHits.Any()) { DisplayResultsForPack(result.SearchHits, environmentSettings, commandArgs, defaultLanguage); } else { //TODO: implement it for template options matching //IReadOnlyDictionary<string, string?>? appliedParameterMatches = TemplateCommandInput.GetTemplateParametersFromCommand(commandArgs); // No templates found matching the following input parameter(s): {0}. Reporter.Error.WriteLine( string.Format( LocalizableStrings.NoTemplatesMatchingInputParameters, GetInputParametersString(commandArgs)) .Bold().Red()); } } Reporter.Output.WriteLine(); if (searchResults.Where(r => r.Success).SelectMany(r => r.SearchHits).Any()) { string packageIdToShow = EvaluatePackageToShow(searchResults); Reporter.Output.WriteLine(LocalizableStrings.CliTemplateSearchCoordinator_Info_InstallHelp); Reporter.Output.WriteCommand( Example .For <NewCommand>(commandArgs.ParseResult) .WithSubcommand <InstallCommand>() .WithArgument(InstallCommand.NameArgument)); Reporter.Output.WriteLine(LocalizableStrings.Generic_ExampleHeader); Reporter.Output.WriteCommand( Example .For <NewCommand>(commandArgs.ParseResult) .WithSubcommand <InstallCommand>() .WithArgument(InstallCommand.NameArgument, packageIdToShow)); return(NewCommandStatus.Success); } return(NewCommandStatus.NotFound); }