File: Commands\Reference\ReferenceAddCommandDefinition.cs
Web Access
Project: 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.StaticCompletions;

namespace Microsoft.DotNet.Cli.Commands.Reference.Add;

internal sealed class ReferenceAddCommandDefinition : ReferenceAddCommandDefinitionBase
{
    public new const string Name = "add";

    public readonly Option<string?> FileOption = ReferenceCommandDefinition.CreateFileOption();

    public ReferenceAddCommandDefinition()
        : base(Name)
    {
        Options.Add(FileOption);
    }

    public ReferenceCommandDefinition Parent => (ReferenceCommandDefinition)Parents.Single();

    public override Option<string?>? GetFileOption() => FileOption;

    public override Option<string?>? GetProjectOption() => Parent.ProjectOption;

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

internal abstract class ReferenceAddCommandDefinitionBase : Command
{
    public readonly Argument<IEnumerable<string>> ProjectPathArgument = new(CommandDefinitionStrings.ReferenceAddProjectPathArgumentName)
    {
        Description = CommandDefinitionStrings.ReferenceAddProjectPathArgumentDescription,
        Arity = ArgumentArity.OneOrMore,
        CustomParser = arguments =>
        {
            var result = arguments.Tokens.TakeWhile(t => !t.Value.StartsWith("-"));
            arguments.OnlyTake(result.Count());
            return result.Select(t => t.Value);
        }
    };

    public readonly Option<string> FrameworkOption = new("--framework", "-f")
    {
        Description = CommandDefinitionStrings.ReferenceAddCmdFrameworkDescription,
        HelpName = CommandDefinitionStrings.CommonCmdFramework,
        IsDynamic = true,
    };

    public readonly Option<bool> InteractiveOption = CommonOptions.CreateInteractiveOption();

    public ReferenceAddCommandDefinitionBase(string name)
        : base(name, CommandDefinitionStrings.ReferenceAddAppFullName)
    {
        Arguments.Add(ProjectPathArgument);
        Options.Add(FrameworkOption);
        Options.Add(InteractiveOption);
    }

    public abstract Option<string?>? GetFileOption();

    public abstract Option<string?>? GetProjectOption();

    public abstract Argument<string>? GetProjectOrFileArgument();
}