File: Commands\Tool\Run\ToolRunCommand.cs
Web Access
Project: src\src\sdk\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.

using System.CommandLine;
using Microsoft.DotNet.Cli.CommandFactory;
using Microsoft.DotNet.Cli.CommandFactory.CommandResolution;
using Microsoft.DotNet.Cli.ToolManifest;
using Microsoft.DotNet.Cli.Utils;

namespace Microsoft.DotNet.Cli.Commands.Tool.Run;

internal sealed class ToolRunCommand : CommandBase<ToolRunCommandDefinition>
{
    private readonly string? _toolCommandName;
    private readonly IEnumerable<string>? _forwardArgument;

    private readonly LocalToolsCommandResolver _localToolsCommandResolver;
    public bool _allowRollForward;

    public ToolRunCommand(ParseResult result, LocalToolsCommandResolver? localToolsCommandResolver = null, ToolManifestFinder? toolManifest = null)
        : base(result)
    {
        _toolCommandName = result.GetValue(Definition.CommandNameArgument);
        _forwardArgument = result.GetValue(Definition.CommandArgument);
        _localToolsCommandResolver = localToolsCommandResolver ?? new LocalToolsCommandResolver(toolManifest);
        _allowRollForward = result.GetValue(Definition.RollForwardOption);
    }

    public override int Execute()
    {
        return ExecuteCommand(_localToolsCommandResolver, _toolCommandName, _forwardArgument, _allowRollForward);
    }

    public static int ExecuteCommand(LocalToolsCommandResolver commandResolver, string? toolCommandName, IEnumerable<string>? argumentsToForward, bool allowRollForward)
    {
        using var _ = Activities.Source.StartActivity("execute-local-tool");
        CommandSpec? commandSpec = commandResolver.ResolveStrict(new CommandResolverArguments()
        {
            // since LocalToolsCommandResolver is a resolver, and all resolver input have dotnet-
            CommandName = $"dotnet-{toolCommandName}",
            CommandArguments = argumentsToForward,
        }, allowRollForward);

        if (commandSpec == null)
        {
            throw new GracefulException([string.Format(CliCommandStrings.CannotFindCommandName, toolCommandName)], isUserError: false);
        }

        var result = CommandFactoryUsingResolver.Create(commandSpec).Execute();
        return result.ExitCode;
    }
}