|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.CommandLine;
using System.CommandLine.Completions;
using Microsoft.DotNet.Cli.Commands.New;
using Microsoft.DotNet.Cli.Help;
using Microsoft.TemplateEngine.Abstractions;
using Microsoft.TemplateEngine.Edge.Settings;
namespace Microsoft.TemplateEngine.Cli.Commands
{
internal partial class NewCommand(Func<ParseResult, ITemplateEngineHost> hostBuilder, NewCommandDefinition definition)
: BaseCommand<NewCommandArgs, NewCommandDefinition>(hostBuilder, definition), ICustomHelp
{
protected internal override IEnumerable<CompletionItem> GetCompletions(CompletionContext context, IEngineEnvironmentSettings environmentSettings, TemplatePackageManager templatePackageManager)
{
if (context is not TextCompletionContext textCompletionContext)
{
foreach (CompletionItem completion in base.GetCompletions(context, environmentSettings, templatePackageManager))
{
yield return completion;
}
yield break;
}
InstantiateCommandArgs instantiateCommandArgs = InstantiateCommandArgs.FromNewCommandArgs(ParseContext(context.ParseResult));
HostSpecificDataLoader? hostSpecificDataLoader = new(environmentSettings);
//TODO: consider new API to get templates only from cache (non async)
IReadOnlyList<ITemplateInfo> templates =
Task.Run(async () => await templatePackageManager.GetTemplatesAsync(default).ConfigureAwait(false)).GetAwaiter().GetResult();
IEnumerable<TemplateGroup> templateGroups = TemplateGroup.FromTemplateList(CliTemplateInfo.FromTemplateInfo(templates, hostSpecificDataLoader));
if (templateGroups.Any(template => template.ShortNames.Contains(instantiateCommandArgs.ShortName)))
{
foreach (CompletionItem completion in InstantiateCommand.GetTemplateCompletions(instantiateCommandArgs, templateGroups, environmentSettings, templatePackageManager, textCompletionContext))
{
yield return completion;
}
yield break;
}
foreach (CompletionItem completion in InstantiateCommand.GetTemplateNameCompletions(instantiateCommandArgs.ShortName, templateGroups, environmentSettings))
{
yield return completion;
}
foreach (CompletionItem completion in base.GetCompletions(context, environmentSettings, templatePackageManager))
{
yield return completion;
}
}
protected override Task<NewCommandStatus> ExecuteAsync(
NewCommandArgs args,
IEngineEnvironmentSettings environmentSettings,
TemplatePackageManager templatePackageManager,
ParseResult parseResult,
CancellationToken cancellationToken)
{
return InstantiateCommand.ExecuteAsync(args, environmentSettings, templatePackageManager, parseResult, cancellationToken);
}
protected override NewCommandArgs ParseContext(ParseResult parseResult) => new(this, parseResult);
}
}
|