File: ProgramBase.cs
Web Access
Project: src\src\Tools\GetDocumentInsider\src\GetDocument.Insider.csproj (GetDocument.Insider)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Text;
using Microsoft.Extensions.ApiDescription.Tool.Commands;
using Microsoft.Extensions.CommandLineUtils;
using Microsoft.Extensions.Tools.Internal;
 
namespace Microsoft.Extensions.ApiDescription.Tool;
 
internal abstract class ProgramBase
{
    private readonly IConsole _console;
    private readonly IReporter _reporter;
 
    public ProgramBase(IConsole console)
    {
        _console = console ?? throw new ArgumentNullException(nameof(console));
        _reporter = new ConsoleReporter(_console, verbose: false, quiet: false);
    }
 
    protected static IConsole GetConsole()
    {
        var console = PhysicalConsole.Singleton;
        if (console.IsOutputRedirected)
        {
            Console.OutputEncoding = Encoding.UTF8;
        }
 
        return console;
    }
 
    // Internal for testing
    internal int Run(string[] args, CommandBase command, bool throwOnUnexpectedArg)
    {
        try
        {
            // AllowArgumentSeparator and continueAfterUnexpectedArg are ignored when !throwOnUnexpectedArg _except_
            // AllowArgumentSeparator=true changes the help text (ignoring throwOnUnexpectedArg).
            var app = new CommandLineApplication(throwOnUnexpectedArg, continueAfterUnexpectedArg: true)
            {
                AllowArgumentSeparator = !throwOnUnexpectedArg,
                Error = _console.Error,
                FullName = Resources.CommandFullName,
                Name = Resources.CommandFullName,
                Out = _console.Out,
            };
 
            command.Configure(app);
 
            return app.Execute(args);
        }
        catch (Exception ex)
        {
            if (ex is CommandException || ex is CommandParsingException)
            {
                _reporter.WriteError(ex.Message);
            }
            else
            {
                _reporter.WriteError(ex.ToString());
            }
 
            return 1;
        }
    }
}