4 changed files with 157 additions and 4 deletions
@ -0,0 +1,17 @@ |
|||
using System; |
|||
|
|||
namespace Tye |
|||
{ |
|||
internal class CommandException : Exception |
|||
{ |
|||
public CommandException(string message) |
|||
: base(message) |
|||
{ |
|||
} |
|||
|
|||
public CommandException(string message, Exception innerException) |
|||
: base(message, innerException) |
|||
{ |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,67 @@ |
|||
using System.Linq; |
|||
|
|||
namespace System.CommandLine |
|||
{ |
|||
internal static class ConsoleExtensions |
|||
{ |
|||
private static bool? isConsoleRedirectionCheckSupported; |
|||
|
|||
private static bool IsConsoleRedirectionCheckSupported |
|||
{ |
|||
get |
|||
{ |
|||
if (isConsoleRedirectionCheckSupported == null) |
|||
{ |
|||
try |
|||
{ |
|||
var check = Console.IsOutputRedirected; |
|||
isConsoleRedirectionCheckSupported = true; |
|||
} |
|||
|
|||
catch (PlatformNotSupportedException) |
|||
{ |
|||
isConsoleRedirectionCheckSupported = false; |
|||
} |
|||
} |
|||
|
|||
return isConsoleRedirectionCheckSupported.Value; |
|||
} |
|||
} |
|||
|
|||
public static void SetTerminalForegroundColor(this IConsole console, ConsoleColor color) |
|||
{ |
|||
if (console.GetType().GetInterfaces().Any(i => i.Name == "ITerminal")) |
|||
{ |
|||
((dynamic)console).ForegroundColor = color; |
|||
} |
|||
|
|||
if (IsConsoleRedirectionCheckSupported && |
|||
!Console.IsOutputRedirected) |
|||
{ |
|||
Console.ForegroundColor = color; |
|||
} |
|||
else if (IsConsoleRedirectionCheckSupported) |
|||
{ |
|||
Console.ForegroundColor = color; |
|||
} |
|||
} |
|||
|
|||
public static void ResetTerminalForegroundColor(this IConsole console) |
|||
{ |
|||
if (console.GetType().GetInterfaces().Any(i => i.Name == "ITerminal")) |
|||
{ |
|||
((dynamic)console).ForegroundColor = ConsoleColor.Red; |
|||
} |
|||
|
|||
if (IsConsoleRedirectionCheckSupported && |
|||
!Console.IsOutputRedirected) |
|||
{ |
|||
Console.ResetColor(); |
|||
} |
|||
else if (IsConsoleRedirectionCheckSupported) |
|||
{ |
|||
Console.ResetColor(); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -1,12 +1,73 @@ |
|||
using System; |
|||
using System.CommandLine; |
|||
using System.CommandLine.Builder; |
|||
using System.CommandLine.Help; |
|||
using System.CommandLine.Invocation; |
|||
using System.CommandLine.IO; |
|||
using System.CommandLine.Parsing; |
|||
using System.Threading.Tasks; |
|||
|
|||
namespace tye |
|||
namespace Tye |
|||
{ |
|||
class Program |
|||
static partial class Program |
|||
{ |
|||
static void Main(string[] args) |
|||
public static async Task<int> Main(string[] args) |
|||
{ |
|||
Console.WriteLine("Hello World!"); |
|||
var command = new RootCommand() |
|||
{ |
|||
Description = "Developer tools and publishing for microservices.", |
|||
}; |
|||
|
|||
// Show commandline help unless a subcommand was used.
|
|||
command.Handler = CommandHandler.Create<IHelpBuilder>(help => |
|||
{ |
|||
help.Write(command); |
|||
return 1; |
|||
}); |
|||
|
|||
var builder = new CommandLineBuilder(command); |
|||
builder.UseHelp(); |
|||
builder.UseVersionOption(); |
|||
builder.UseDebugDirective(); |
|||
builder.UseParseErrorReporting(); |
|||
builder.ParseResponseFileAs(ResponseFileHandling.ParseArgsAsSpaceSeparated); |
|||
|
|||
builder.CancelOnProcessTermination(); |
|||
builder.UseExceptionHandler(HandleException); |
|||
|
|||
var parser = builder.Build(); |
|||
return await parser.InvokeAsync(args); |
|||
} |
|||
|
|||
private static void HandleException(Exception exception, InvocationContext context) |
|||
{ |
|||
context.Console.ResetTerminalForegroundColor(); |
|||
context.Console.SetTerminalForegroundColor(ConsoleColor.Red); |
|||
|
|||
if (exception is OperationCanceledException) |
|||
{ |
|||
context.Console.Error.WriteLine("Oh dear! Operation canceled."); |
|||
} |
|||
else if (exception is CommandException command) |
|||
{ |
|||
context.Console.Error.WriteLine($"Drats! '{context.ParseResult.CommandResult.Command.Name}' failed:"); |
|||
context.Console.Error.WriteLine($"\t{command.Message}"); |
|||
|
|||
if (command.InnerException != null) |
|||
{ |
|||
context.Console.Error.WriteLine(); |
|||
context.Console.Error.WriteLine(command.InnerException.ToString()); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
context.Console.Error.WriteLine("An unhandled exception has occurred, how unseemly: "); |
|||
context.Console.Error.WriteLine(exception.ToString()); |
|||
} |
|||
|
|||
context.Console.ResetTerminalForegroundColor(); |
|||
|
|||
context.ResultCode = 1; |
|||
} |
|||
} |
|||
} |
|||
|
|||
Loading…
Reference in new issue