| File: CliTemplateInfo.cs | Web Access |
| Project: src\sdk\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.Abstractions.Constraints; using Microsoft.TemplateEngine.Abstractions.Parameters; using Microsoft.TemplateEngine.Abstractions.TemplatePackage; using Microsoft.TemplateEngine.Edge.Settings; using Microsoft.TemplateEngine.Utils; namespace Microsoft.TemplateEngine.Cli { /// <summary> /// <see cref="ITemplateInfo"/> + <see cref="HostSpecificTemplateData"/>. /// </summary> internal class CliTemplateInfo : ITemplateInfo { private readonly ITemplateInfo _templateInfo; private readonly HostSpecificTemplateData _cliData; private IReadOnlyDictionary<string, CliTemplateParameter>? _parameters; internal CliTemplateInfo(ITemplateInfo templateInfo, HostSpecificTemplateData cliData) { _templateInfo = templateInfo ?? throw new ArgumentNullException(nameof(templateInfo)); _cliData = cliData ?? throw new ArgumentNullException(nameof(cliData)); } public string? Author => _templateInfo.Author; public string? Description => _templateInfo.Description; public IReadOnlyList<string> Classifications => _templateInfo.Classifications; public string? DefaultName => _templateInfo.DefaultName; public string Identity => _templateInfo.Identity; public Guid GeneratorId => _templateInfo.GeneratorId; public string? GroupIdentity => _templateInfo.GroupIdentity; public int Precedence => _templateInfo.Precedence; public string Name => _templateInfo.Name; [Obsolete] public string ShortName => _templateInfo.ShortName; [Obsolete] public IReadOnlyDictionary<string, ICacheTag> Tags => _templateInfo.Tags; public IReadOnlyDictionary<string, string> TagsCollection => _templateInfo.TagsCollection; [Obsolete] public IReadOnlyDictionary<string, ICacheParameter> CacheParameters => _templateInfo.CacheParameters; public IParameterDefinitionSet ParameterDefinitions => _templateInfo.ParameterDefinitions; [Obsolete("Use ParameterDefinitionSet instead.")] public IReadOnlyList<ITemplateParameter> Parameters => ParameterDefinitions; public string MountPointUri => _templateInfo.MountPointUri; public string ConfigPlace => _templateInfo.ConfigPlace; public string? LocaleConfigPlace => _templateInfo.LocaleConfigPlace; public string? HostConfigPlace => _templateInfo.HostConfigPlace; public string? ThirdPartyNotices => _templateInfo.ThirdPartyNotices; public bool PreferDefaultName => _templateInfo.PreferDefaultName; public IReadOnlyDictionary<string, IBaselineInfo> BaselineInfo => _templateInfo.BaselineInfo; [Obsolete] public bool HasScriptRunningPostActions { get => _templateInfo.HasScriptRunningPostActions; set => _templateInfo.HasScriptRunningPostActions = value; } public IReadOnlyList<string> ShortNameList => _templateInfo.ShortNameList; public IReadOnlyList<Guid> PostActions => _templateInfo.PostActions; public IReadOnlyList<TemplateConstraintInfo> Constraints => _templateInfo.Constraints; internal HostSpecificTemplateData CliData => _cliData; internal bool IsHidden => _cliData.IsHidden; internal IReadOnlyDictionary<string, CliTemplateParameter> CliParameters { get { if (_parameters == null) { Dictionary<string, CliTemplateParameter> parameters = new(); foreach (ITemplateParameter parameter in ParameterDefinitions.Where(param => param.Type == "parameter")) { if (parameters.ContainsKey(parameter.Name)) { //runnable projects generator ensures the symbols are unique, so no error handling here. //in case there is a duplicate, the logic is broken. throw new Exception($"Template {Identity} defines {parameter.Name} twice."); } if (parameter.IsChoice()) { parameters[parameter.Name] = new ChoiceTemplateParameter(parameter, CliData); } else { parameters[parameter.Name] = new CliTemplateParameter(parameter, CliData); } } _parameters = parameters; } return _parameters; } } internal static IEnumerable<CliTemplateInfo> FromTemplateInfo(IEnumerable<ITemplateInfo> templateInfos, IHostSpecificDataLoader hostSpecificDataLoader) { if (templateInfos is null) { throw new ArgumentNullException(nameof(templateInfos)); } if (hostSpecificDataLoader is null) { throw new ArgumentNullException(nameof(hostSpecificDataLoader)); } return templateInfos.Select(templateInfo => new CliTemplateInfo(templateInfo, hostSpecificDataLoader.ReadHostSpecificTemplateData(templateInfo))); } /// <summary> /// Gets the <b>managed</b> template package which contain the template, <see langword="null"/> otherwise. /// </summary> /// <remarks> /// The method might throw exceptions if <see cref="TemplatePackageManager.GetTemplatePackageAsync(ITemplateInfo, CancellationToken)"/> call throws. /// </remarks> internal async Task<IManagedTemplatePackage?> GetManagedTemplatePackageAsync( TemplatePackageManager templatePackageManager, CancellationToken cancellationToken) { ITemplatePackage templatePackage = await GetTemplatePackageAsync(templatePackageManager, cancellationToken).ConfigureAwait(false); return templatePackage as IManagedTemplatePackage; } /// <summary> /// Gets the template package which contains the template. /// </summary> /// <remarks> /// The method might throw exceptions if <see cref="TemplatePackageManager.GetTemplatePackageAsync(ITemplateInfo, CancellationToken)"/> call throws. /// </remarks> internal Task<ITemplatePackage> GetTemplatePackageAsync( TemplatePackageManager templatePackageManager, CancellationToken cancellationToken) { return templatePackageManager.GetTemplatePackageAsync(this, cancellationToken); } } }