File: Commands\Tool\Common\ToolAppliedOption.cs
Web Access
Project: ..\..\..\src\Cli\dotnet\dotnet.csproj (dotnet)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable disable
 
using System.CommandLine;
using Microsoft.DotNet.Cli.Commands.Tool.Install;
using Microsoft.DotNet.Cli.Extensions;
using Microsoft.DotNet.Cli.Utils;
 
namespace Microsoft.DotNet.Cli.Commands.Tool.Common;
 
internal class ToolAppliedOption
{
    private const string GlobalOptionName = "--global";
    private const string LocalOptionName = "--local";
    private const string ToolPathName = "--tool-path";
    private const string ToolManifestName = "--tool-manifest";
 
    public static Option<bool> GlobalOption(string description) => new(GlobalOptionName, "-g")
    {
        Arity = ArgumentArity.Zero,
        Description = description
    };
 
    public static Option<bool> LocalOption(string description) => new(LocalOptionName)
    {
        Arity = ArgumentArity.Zero,
        Description = description,
    };
 
    public static Option<bool> UpdateAllOption = new("--all")
    {
        Description = CliCommandStrings.UpdateAllOptionDescription,
        Arity = ArgumentArity.Zero
    };
 
    public static readonly Option<string> VersionOption
        = ToolInstallCommandParser.VersionOption
          ?? new("--version"); // Workaround for Mono runtime (https://github.com/dotnet/sdk/issues/41672)
 
    public static Option<string> ToolPathOption(string description) => new(ToolPathName)
    {
        HelpName = CliCommandStrings.ToolInstallToolPathOptionName,
        Description = description,
    };
 
    public static Option<string> ToolManifestOption(string description) => new(ToolManifestName)
    {
        HelpName = CliCommandStrings.ToolInstallManifestPathOptionName,
        Arity = ArgumentArity.ZeroOrOne,
        Description = description,
    };
 
    internal static void EnsureNoConflictGlobalLocalToolPathOption(
        ParseResult parseResult,
        string message)
    {
        List<string> options = [];
        if (parseResult.HasOption(GlobalOptionName))
        {
            options.Add(GlobalOptionName);
        }
 
        if (parseResult.HasOption(LocalOptionName))
        {
            options.Add(LocalOptionName);
        }
 
        if (parseResult.HasOption(ToolPathName))
        {
            options.Add(ToolPathName);
        }
 
        if (options.Count > 1)
        {
            throw new GracefulException(
                string.Format(
                    message,
                    string.Join(" ", options)));
        }
    }
 
    internal static void EnsureNoConflictUpdateAllVersionOption(
        ParseResult parseResult,
        string message)
    {
        List<string> options = [];
        if (parseResult.HasOption(UpdateAllOption))
        {
            options.Add(UpdateAllOption.Name);
        }
 
        if (parseResult.HasOption(VersionOption))
        {
            options.Add(VersionOption.Name);
        }
 
        if (options.Count > 1)
        {
            throw new GracefulException(
                string.Format(
                    message,
                    string.Join(" ", options)));
        }
    }
 
    internal static void EnsureToolManifestAndOnlyLocalFlagCombination(ParseResult parseResult)
    {
        if (GlobalOrToolPath(parseResult) &&
            parseResult.HasOption(ToolManifestName))
        {
            throw new GracefulException(
                string.Format(
                    CliCommandStrings.OnlyLocalOptionSupportManifestFileOption));
        }
    }
 
    private static bool GlobalOrToolPath(ParseResult parseResult)
        => parseResult.HasOption(GlobalOptionName)
        || parseResult.HasOption(ToolPathName);
}