| File: TemplateParameterPrecedence.cs | Web Access |
| Project: src\sdk\src\TemplateEngine\Microsoft.TemplateEngine.Abstractions\Microsoft.TemplateEngine.Abstractions.csproj (Microsoft.TemplateEngine.Abstractions) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. namespace Microsoft.TemplateEngine.Abstractions; /// <summary> /// Indication of template parameter precedence and conditions that could influence it. /// </summary> public class TemplateParameterPrecedence { /// <summary> /// Default optional precedence. /// </summary> public static readonly TemplateParameterPrecedence Default = new(PrecedenceDefinition.Optional); /// <summary> /// Initializes a new instance of the <see cref="TemplateParameterPrecedence"/> class. /// </summary> /// <param name="precedenceDefinition"></param> /// <param name="isRequiredCondition"></param> /// <param name="isEnabledCondition"></param> /// <param name="isRequired"></param> public TemplateParameterPrecedence( PrecedenceDefinition precedenceDefinition, string? isRequiredCondition = null, string? isEnabledCondition = null, bool isRequired = false) { PrecedenceDefinition = precedenceDefinition; IsRequiredCondition = isRequiredCondition; IsEnabledCondition = isEnabledCondition; IsRequired = isRequired; VerifyConditions(); } /// <summary> /// Actual precedence definition - can be used to sort parameters (e.g. for tab completion purposes). /// </summary> public PrecedenceDefinition PrecedenceDefinition { get; } /// <summary> /// IsRequiredCondition value - if it was specified in template. /// </summary> public string? IsRequiredCondition { get; } /// <summary> /// IsEnabledCondition value - if it was specified in template. /// </summary> public string? IsEnabledCondition { get; } /// <summary> /// Indicates whether parameter is unconditionally required. /// </summary> public bool IsRequired { get; } /// <summary> /// Indicates whether parameter might be required (depending on values of other parameters). /// </summary> public bool CanBeRequired => PrecedenceDefinition == PrecedenceDefinition.Required || !string.IsNullOrEmpty(IsRequiredCondition) || IsRequired; private void VerifyConditions() { // If enable condition is set - parameter is conditionally disabled (regardless if require condition is set or not) // Conditionally required is if and only if the only require condition is set if (!(string.IsNullOrEmpty(IsRequiredCondition) ^ PrecedenceDefinition == PrecedenceDefinition.ConditionalyRequired || !string.IsNullOrEmpty(IsEnabledCondition) ^ PrecedenceDefinition == PrecedenceDefinition.ConditionalyDisabled) && !(!string.IsNullOrEmpty(IsRequiredCondition) && !string.IsNullOrEmpty(IsEnabledCondition) && PrecedenceDefinition == PrecedenceDefinition.ConditionalyDisabled)) { // TODO: localize throw new ArgumentException("Mismatched precedence definition"); } } }