File: Commands\BaseFilterableArgs.cs
Web Access
Project: src\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 System.CommandLine;
using System.CommandLine.Parsing;

namespace Microsoft.TemplateEngine.Cli.Commands
{
    internal abstract class BaseFilterableArgs<TDefinition>(ParseResult parseResult) : GlobalArgs(parseResult)
        where TDefinition : Command
    {
        private readonly IReadOnlyDictionary<FilterOptionDefinition, OptionResult> _filters = ParseFilters(parseResult);

        /// <summary>
        /// Gets list of <see cref="FilterOptionDefinition"/> parsed from command.
        /// </summary>
        internal IEnumerable<FilterOptionDefinition> AppliedFilters => _filters.Keys;

        /// <summary>
        /// Gets value for filter <paramref name="filter"/>.
        /// </summary>
        /// <param name="filter"></param>
        /// <returns>value of the filter.</returns>
        /// <exception cref="ArgumentException">when <paramref name="filter"/> is not among <see cref="AppliedFilters"/>.</exception>
        internal string GetFilterValue(FilterOptionDefinition filter)
        {
            if (!_filters.ContainsKey(filter))
            {
                throw new ArgumentException($"{nameof(filter)} is not available in parse result.", nameof(filter));
            }

            return _filters[filter].GetValueOrDefault<string>() ?? string.Empty;
        }

        /// <summary>
        /// Gets token name used for filter <paramref name="filter"/>.
        /// </summary>
        /// <param name="filter"></param>
        /// <returns>Token or null when token cannot be evaluated.</returns>
        internal string? GetFilterToken(FilterOptionDefinition filter)
        {
            return _filters[filter].IdentifierToken?.Value;
        }

        private static IReadOnlyDictionary<FilterOptionDefinition, OptionResult> ParseFilters(ParseResult parseResult)
        {
            var filterableCommand = (IFilterableCommand)parseResult.CommandResult.Command;

            Dictionary<FilterOptionDefinition, OptionResult> filterValues = new();
            foreach (var option in filterableCommand.FilterOptions)
            {
                OptionResult? value = parseResult.GetResult(option);
                if (value != null)
                {
                    filterValues[FilterOptionDefinition.AllDefinitions[option.Name]] = value;
                }
            }
            return filterValues;
        }
    }
}