File: Commands\New\SharedOptionsFactory.cs
Web Access
Project: src\src\sdk\src\Cli\Microsoft.DotNet.Cli.Definitions\Microsoft.DotNet.Cli.Definitions.csproj (Microsoft.DotNet.Cli.Definitions)
// 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.DotNet.Cli.Commands.New;

public static class SharedOptionsFactory
{
    public const string InteractiveOptionName = "--interactive";

    public static Option<bool> CreateInteractiveOption()
    {
        return new Option<bool>(InteractiveOptionName)
        {
            Arity = new ArgumentArity(0, 1),
            Description = CommandDefinitionStrings.Option_Interactive
        };
    }

    public const string AddSourceOptionName = "--add-source";

    public static Option<string[]> CreateAddSourceOption()
    {
        return new(AddSourceOptionName, "--nuget-source")
        {
            Arity = new ArgumentArity(1, 99),
            Description = CommandDefinitionStrings.Option_AddSource,
            AllowMultipleArgumentsPerToken = true,
            HelpName = "nuget-source"
        };
    }

    public const string ForceOptionName = "--force";

    public static Option<bool> CreateForceOption()
    {
        return new(ForceOptionName)
        {
            Arity = new ArgumentArity(0, 1),
            Description = CommandDefinitionStrings.TemplateCommand_Option_Force,
        };
    }

    public const string AuthorOptionName = "--author";

    public static Option<string> CreateAuthorOption()
    {
        return new(AuthorOptionName)
        {
            Arity = new ArgumentArity(1, 1),
            Description = CommandDefinitionStrings.Option_AuthorFilter
        };
    }

    public const string BaselineOptionName = "--baseline";

    public static Option<string> CreateBaselineOption()
    {
        return new(BaselineOptionName)
        {
            Arity = new ArgumentArity(1, 1),
            Description = CommandDefinitionStrings.Option_BaselineFilter,
            Hidden = true
        };
    }

    public const string LanguageOptionName = "--language";

    public static Option<string> CreateLanguageOption()
    {
        return new(LanguageOptionName, "-lang")
        {
            Arity = new ArgumentArity(1, 1),
            Description = CommandDefinitionStrings.Option_LanguageFilter
        };
    }

    public const string TypeOptionName = "--type";

    public static Option<string> CreateTypeOption()
    {
        return new(TypeOptionName)
        {
            Arity = new ArgumentArity(1, 1),
            Description = CommandDefinitionStrings.Option_TypeFilter
        };
    }

    public const string TagOptionName = "--tag";

    public static Option<string> CreateTagOption()
    {
        return new(TagOptionName)
        {
            Arity = new ArgumentArity(1, 1),
            Description = CommandDefinitionStrings.Option_TagFilter
        };
    }

    public const string PackageOptionName = "--package";

    public static Option<string> CreatePackageOption()
    {
        return new(PackageOptionName)
        {
            Arity = new ArgumentArity(1, 1),
            Description = CommandDefinitionStrings.Option_PackageFilter
        };
    }

    public static Option<FileInfo> CreateOutputOption() => new("--output", "-o")
    {
        Description = CommandDefinitionStrings.Option_Output,
        Required = false,
        Arity = new ArgumentArity(1, 1)
    };

    public const string ColumnsAllOptionName = "--columns-all";

    internal static Option<bool> CreateColumnsAllOption()
    {
        return new(ColumnsAllOptionName)
        {
            Arity = ArgumentArity.Zero,
            Description = CommandDefinitionStrings.Option_ColumnsAll
        };
    }

    public const string ColumnsOptionName = "--columns";

    public static Option<string[]> CreateColumnsOption()
    {
        Option<string[]> option = new(ColumnsOptionName)
        {
            Arity = new ArgumentArity(1, 4),
            Description = CommandDefinitionStrings.Option_Columns,
            AllowMultipleArgumentsPerToken = true,
            CustomParser = ParseCommaSeparatedValues
        };
        option.AcceptOnlyFromAmong(
            TabularOutputSettingsColumnNames.Author,
            TabularOutputSettingsColumnNames.Language,
            TabularOutputSettingsColumnNames.Type,
            TabularOutputSettingsColumnNames.Tags);
        return option;
    }

    internal static string[] ParseCommaSeparatedValues(ArgumentResult result)
    {
        List<string> values = new();
        foreach (string value in result.Tokens.Select(t => t.Value))
        {
            values.AddRange(value.Split(",", StringSplitOptions.TrimEntries).Where(s => !string.IsNullOrWhiteSpace(s)));
        }
        return values.ToArray();
    }

    public const string NameOptionName = "--name";

    public static Option<string> CreateNameOption() => new(NameOptionName, "-n")
    {
        Description = CommandDefinitionStrings.TemplateCommand_Option_Name,
        Arity = new ArgumentArity(1, 1)
    };

    public const string DryRunOptionName = "--dry-run";

    public static Option<bool> CreateDryRunOption() => new(DryRunOptionName)
    {
        Description = CommandDefinitionStrings.TemplateCommand_Option_DryRun,
        Arity = new ArgumentArity(0, 1)
    };

    public const string NoUpdateCheckOptionName = "--no-update-check";

    public static Option<bool> CreateNoUpdateCheckOption() => new(NoUpdateCheckOptionName)
    {
        Description = CommandDefinitionStrings.TemplateCommand_Option_NoUpdateCheck,
        Arity = new ArgumentArity(0, 1)
    };

    public const string ProjectOptionName = "--project";

    public static Option<FileInfo> CreateProjectOption() => new Option<FileInfo>(ProjectOptionName)
    {
        Description = CommandDefinitionStrings.Option_ProjectPath
    }.AcceptExistingOnly();
}