File: Commands\Package\PackageListCommandDefinition.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 Microsoft.DotNet.Cli.CommandLine;

namespace Microsoft.DotNet.Cli.Commands.Package.List;

internal sealed class PackageListCommandDefinition() : PackageListCommandDefinitionBase(Name)
{
    public new const string Name = "list";

    public override Argument<string>? GetProjectOrFileArgument()
        => null;
}

internal abstract class PackageListCommandDefinitionBase : Command
{
    public readonly Option OutdatedOption = new Option<bool>("--outdated")
    {
        Description = CommandDefinitionStrings.CmdOutdatedDescription,
        Arity = ArgumentArity.Zero
    }.ForwardAs("--outdated");

    public readonly Option DeprecatedOption = new Option<bool>("--deprecated")
    {
        Description = CommandDefinitionStrings.CmdDeprecatedDescription,
        Arity = ArgumentArity.Zero
    }.ForwardAs("--deprecated");

    public readonly Option VulnerableOption = new Option<bool>("--vulnerable")
    {
        Description = CommandDefinitionStrings.CmdVulnerableDescription,
        Arity = ArgumentArity.Zero
    }.ForwardAs("--vulnerable");

    public readonly Option FrameworkOption = new Option<IEnumerable<string>>("--framework", "-f")
    {
        Description = CommandDefinitionStrings.PackageListCmdFrameworkDescription,
        HelpName = CommandDefinitionStrings.PackageListCmdFramework
    }.ForwardAsManyArgumentsEachPrefixedByOption("--framework")
    .AllowSingleArgPerToken();

    public readonly Option TransitiveOption = new Option<bool>("--include-transitive")
    {
        Description = CommandDefinitionStrings.CmdTransitiveDescription,
        Arity = ArgumentArity.Zero
    }.ForwardAs("--include-transitive");

    public readonly Option PrereleaseOption = new Option<bool>("--include-prerelease")
    {
        Description = CommandDefinitionStrings.CmdPrereleaseDescription,
        Arity = ArgumentArity.Zero
    }.ForwardAs("--include-prerelease");

    public readonly Option HighestPatchOption = new Option<bool>("--highest-patch")
    {
        Description = CommandDefinitionStrings.CmdHighestPatchDescription,
        Arity = ArgumentArity.Zero
    }.ForwardAs("--highest-patch");

    public readonly Option HighestMinorOption = new Option<bool>("--highest-minor")
    {
        Description = CommandDefinitionStrings.CmdHighestMinorDescription,
        Arity = ArgumentArity.Zero
    }.ForwardAs("--highest-minor");

    public readonly Option ConfigOption = new Option<string>("--config", "--configfile")
    {
        Description = CommandDefinitionStrings.CmdConfigDescription,
        HelpName = CommandDefinitionStrings.CmdConfig
    }.ForwardAsMany(o => ["--config", o!]);

    public readonly Option SourceOption = new Option<IEnumerable<string>>("--source", "-s")
    {
        Description = CommandDefinitionStrings.PackageListCmdSourceDescription,
        HelpName = CommandDefinitionStrings.PackageListCmdSource
    }.ForwardAsManyArgumentsEachPrefixedByOption("--source")
    .AllowSingleArgPerToken();

    public readonly Option<bool> InteractiveOption = CommonOptions.CreateInteractiveOption().ForwardIfEnabled("--interactive");

    public readonly Option NoRestore = new Option<bool>("--no-restore")
    {
        Description = CommandDefinitionStrings.CmdNoRestoreDescription,
        Arity = ArgumentArity.Zero
    };

    public readonly Option VerbosityOption = new Option<Utils.VerbosityOptions>("--verbosity", "-v")
    {
        Description = CommandDefinitionStrings.VerbosityOptionDescription,
        HelpName = CommandDefinitionStrings.LevelArgumentName
    }.ForwardAsSingle(o => $"--verbosity:{o}");

    public readonly Option<ReportOutputFormat> FormatOption = new Option<ReportOutputFormat>("--format")
    {
        Description = CommandDefinitionStrings.CmdFormatDescription
    }.ForwardAsSingle(o => $"--format:{o}");

    public readonly Option OutputVersionOption = new Option<int>("--output-version")
    {
        Description = CommandDefinitionStrings.CmdOutputVersionDescription
    }.ForwardAsSingle(o => $"--output-version:{o}");

    public readonly Option<string?> ProjectOption = PackageCommandDefinition.CreateProjectOption();
    public readonly Option<string?> FileOption = PackageCommandDefinition.CreateFileOption();

    public PackageListCommandDefinitionBase(string name)
        : base(name, CommandDefinitionStrings.PackageListAppFullName)
    {
        Options.Add(VerbosityOption);
        Options.Add(OutdatedOption);
        Options.Add(DeprecatedOption);
        Options.Add(VulnerableOption);
        Options.Add(FrameworkOption);
        Options.Add(TransitiveOption);
        Options.Add(PrereleaseOption);
        Options.Add(HighestPatchOption);
        Options.Add(HighestMinorOption);
        Options.Add(ConfigOption);
        Options.Add(SourceOption);
        Options.Add(InteractiveOption);
        Options.Add(FormatOption);
        Options.Add(OutputVersionOption);
        Options.Add(NoRestore);
        Options.Add(ProjectOption);
        Options.Add(FileOption);
    }

    public abstract Argument<string>? GetProjectOrFileArgument();

    public void EnforceOptionRules(ParseResult parseResult)
    {
        var mutexOptionCount = 0;
        mutexOptionCount += parseResult.HasOption(DeprecatedOption) ? 1 : 0;
        mutexOptionCount += parseResult.HasOption(OutdatedOption) ? 1 : 0;
        mutexOptionCount += parseResult.HasOption(VulnerableOption) ? 1 : 0;
        if (mutexOptionCount > 1)
        {
            throw new Utils.GracefulException(CommandDefinitionStrings.OptionsCannotBeCombined);
        }
    }
}