File: Macros\SwitchMacroConfig.cs
Web Access
Project: src\sdk\src\TemplateEngine\Microsoft.TemplateEngine.Orchestrator.RunnableProjects\Microsoft.TemplateEngine.Orchestrator.RunnableProjects.csproj (Microsoft.TemplateEngine.Orchestrator.RunnableProjects)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Text.Json.Nodes;
using Microsoft.TemplateEngine.Orchestrator.RunnableProjects.Abstractions;
using Microsoft.TemplateEngine.Utils;

namespace Microsoft.TemplateEngine.Orchestrator.RunnableProjects.Macros
{
    internal class SwitchMacroConfig : BaseMacroConfig<SwitchMacro, SwitchMacroConfig>, IMacroConfigDependency
    {
        private const string CasesPropertyName = "cases";
        private const string CasesConditionPropertyName = "condition";
        private const string CasesValuePropertyName = "value";
        private const EvaluatorType DefaultEvaluator = EvaluatorType.CPP2;

        internal SwitchMacroConfig(SwitchMacro macro, string variableName, string evaluator, string dataType, IReadOnlyList<(string?, string)> cases)
             : base(macro, variableName, dataType)
        {
            Evaluator = EvaluatorSelector.SelectStringEvaluator(EvaluatorSelector.ParseEvaluatorName(evaluator, DefaultEvaluator));
            Cases = cases;
        }

        internal SwitchMacroConfig(SwitchMacro macro, IGeneratedSymbolConfig generatedSymbolConfig)
            : base(macro, generatedSymbolConfig.VariableName, generatedSymbolConfig.DataType)
        {
            string? evaluator = GetOptionalParameterValue(generatedSymbolConfig, "evaluator");
            if (!string.IsNullOrWhiteSpace(evaluator))
            {
                Evaluator = EvaluatorSelector.SelectStringEvaluator(EvaluatorSelector.ParseEvaluatorName(evaluator, DefaultEvaluator));
            }
            List<(string? Condition, string Value)> cases = new();
            JsonArray jArray = GetMandatoryParameterArray(generatedSymbolConfig, CasesPropertyName);

            foreach (JsonNode? entry in jArray)
            {
                if (entry is not JsonObject jObj)
                {
                    throw new TemplateAuthoringException(string.Format(LocalizableStrings.MacroConfig_Exception_ArrayShouldContainObjects, generatedSymbolConfig.VariableName, CasesPropertyName), generatedSymbolConfig.VariableName);
                }
                string? condition = jObj.ToString(CasesConditionPropertyName);
                string? value = jObj.ToString(CasesValuePropertyName)
                    ?? throw new TemplateAuthoringException(
                        string.Format(
                            LocalizableStrings.MacroConfig_Exception_MissingValueProperty,
                            generatedSymbolConfig.VariableName,
                            CasesPropertyName,
                            CasesValuePropertyName),
                        generatedSymbolConfig.VariableName);
                cases.Add((condition, value));
            }
            Cases = cases;
        }

        internal ConditionStringEvaluator Evaluator { get; private set; } = EvaluatorSelector.SelectStringEvaluator(DefaultEvaluator);

        internal IReadOnlyList<(string? Condition, string Value)> Cases { get; }

        public void ResolveSymbolDependencies(IReadOnlyList<string> symbols)
        {
            MacroDependenciesResolved = true;
            foreach ((string? condition, string _) in Cases)
            {
                if (!string.IsNullOrEmpty(condition))
                {
                    PopulateMacroConfigDependencies(condition!, symbols);
                }
            }
        }
    }
}