File: Commands\create\TemplateOption.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 System.CommandLine;
 
namespace Microsoft.TemplateEngine.Cli.Commands
{
    internal class TemplateOption : IEquatable<TemplateOption>
    {
        private Option _option;
 
        internal TemplateOption(
            CliTemplateParameter parameter,
            IReadOnlySet<string> aliases)
        {
            TemplateParameter = parameter;
            Aliases = aliases;
            _option = TemplateParameter.GetOption(Aliases);
        }
 
        internal CliTemplateParameter TemplateParameter { get; private set; }
 
        internal IReadOnlySet<string> Aliases { get; private set; }
 
        internal Option Option => _option;
 
        public bool Equals(TemplateOption? other)
        {
            if (other == null)
            {
                return false;
            }
 
            if (ReferenceEquals(this, other))
            {
                return true;
            }
 
            if (!string.Equals(TemplateParameter.Name, other.TemplateParameter.Name, StringComparison.Ordinal))
            {
                return false;
            }
 
            if (TemplateParameter.Type != other.TemplateParameter.Type)
            {
                return false;
            }
 
            if (Aliases.Count != other.Aliases.Count)
            {
                return false;
            }
 
            foreach (string alias in other.Aliases)
            {
                if (!Aliases.Contains(alias))
                {
                    return false;
                }
            }
            return true;
        }
 
        public override bool Equals(object? obj) => Equals(obj as TemplateOption);
 
        public override int GetHashCode()
        {
            return new { a = TemplateParameter.Name, b = TemplateParameter.Type, c = Aliases.Aggregate(0, (sum, next) => sum ^ next.GetHashCode()) }.GetHashCode();
        }
 
        internal void MergeChoices(ChoiceTemplateParameter choiceParam)
        {
            if (TemplateParameter is not ChoiceTemplateParameter currentChoiceParam)
            {
                return;
            }
 
            if (TemplateParameter is CombinedChoiceTemplateParameter combinedParam)
            {
                combinedParam.MergeChoices(choiceParam);
            }
            else
            {
                var combinedChoice = new CombinedChoiceTemplateParameter(currentChoiceParam);
                combinedChoice.MergeChoices(choiceParam);
                TemplateParameter = combinedChoice;
            }
            _option = TemplateParameter.GetOption(Aliases);
        }
    }
}