File: TemplateResolution\BaseTemplateResolver.cs
Web Access
Project: ..\..\..\src\Cli\Microsoft.TemplateEngine.Cli\Microsoft.TemplateEngine.Cli.csproj (Microsoft.TemplateEngine.Cli)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.TemplateEngine.Abstractions;
using Microsoft.TemplateEngine.Edge.Settings;
 
namespace Microsoft.TemplateEngine.Cli.TemplateResolution
{
    internal abstract class BaseTemplateResolver<T> : BaseTemplateResolver
    {
        internal BaseTemplateResolver(TemplatePackageManager templatePackageManager, IHostSpecificDataLoader hostSpecificDataLoader)
            : base(templatePackageManager, hostSpecificDataLoader) { }
 
        internal BaseTemplateResolver(IEnumerable<ITemplateInfo> templateList, IHostSpecificDataLoader hostSpecificDataLoader)
            : base(templateList, hostSpecificDataLoader) { }
 
        internal abstract Task<TemplateResolutionResult> ResolveTemplatesAsync(T args, string? defaultLanguage, CancellationToken cancellationToken);
    }
 
    internal abstract class BaseTemplateResolver
    {
        private readonly IReadOnlyList<ITemplateInfo>? _templateList;
        private readonly TemplatePackageManager? _templatePackageManager;
 
        internal BaseTemplateResolver(TemplatePackageManager templatePackageManager, IHostSpecificDataLoader hostSpecificDataLoader)
        {
            _templatePackageManager = templatePackageManager ?? throw new ArgumentNullException(nameof(templatePackageManager));
            HostSpecificDataLoader = hostSpecificDataLoader ?? throw new ArgumentNullException(nameof(hostSpecificDataLoader));
        }
 
        internal BaseTemplateResolver(IEnumerable<ITemplateInfo> templateList, IHostSpecificDataLoader hostSpecificDataLoader)
        {
            _templateList = templateList?.ToList() ?? throw new ArgumentNullException(nameof(templateList));
            HostSpecificDataLoader = hostSpecificDataLoader ?? throw new ArgumentNullException(nameof(hostSpecificDataLoader));
        }
 
        protected IHostSpecificDataLoader HostSpecificDataLoader { get; }
 
        protected async Task<IEnumerable<TemplateGroup>> GetTemplateGroupsAsync(CancellationToken cancellationToken)
        {
            IEnumerable<ITemplateInfo> templates;
            if (_templateList != null)
            {
                templates = _templateList;
            }
            else if (_templatePackageManager != null)
            {
                templates = await _templatePackageManager.GetTemplatesAsync(cancellationToken).ConfigureAwait(false);
            }
            else
            {
                throw new Exception($"Both {nameof(_templateList)} and {nameof(_templatePackageManager)} cannot be null.");
            }
            templates = templates.Where(x => !x.IsHiddenByHostFile(HostSpecificDataLoader));
            return TemplateGroup.FromTemplateList(CliTemplateInfo.FromTemplateInfo(templates, HostSpecificDataLoader));
        }
 
    }
}