public sealed override int Invoke(IEnumerable <string> arguments) { var commandArguments = Arguments.GetCommandArguments(); var options = new OptionSet(); foreach (var arg in commandArguments) { options.Add(arg.Prototype, arg.Description, arg.Action); } using var parseFactory = CreateLoggerFactory(Arguments.Verbosity); var parseLogger = parseFactory.CreateLogger(Name); try { var regularArguments = arguments.TakeWhile(arg => arg != Program.VerbatimArgumentPlaceholder); if (regularArguments.Count() < arguments.Count()) { PassThroughArguments = arguments.Skip(regularArguments.Count() + 1); arguments = regularArguments; } var extra = options.Parse(arguments); if (extra.Count > 0) { if (_allowsExtraArgs) { ExtraArguments = extra; } else { throw new ArgumentException($"Unknown arguments: {string.Join(" ", extra)}"); } } if (Arguments.ShowHelp) { Console.WriteLine("usage: " + CommandUsage + Environment.NewLine + Environment.NewLine + CommandDescription + Environment.NewLine); options.WriteOptionDescriptions(Console.Out); return((int)ExitCode.HELP_SHOWN); } Arguments.Validate(); } catch (ArgumentException e) { parseLogger.LogError(e.Message); if (Arguments.ShowHelp) { options.WriteOptionDescriptions(Console.Out); } return((int)ExitCode.INVALID_ARGUMENTS); } catch (Exception e) { parseLogger.LogCritical("Unexpected failure argument: {error}", e); return((int)ExitCode.GENERAL_FAILURE); } // Should we and where output the diagnostics data? string?diagnosticsPath = Arguments.Diagnostics.Value ?? Environment.GetEnvironmentVariable(EnvironmentVariables.Names.DIAGNOSTICS_PATH); try { using var factory = CreateLoggerFactory(Arguments.Verbosity); ILogger logger = factory.CreateLogger(Name); var diagnostics = new CommandDiagnostics(logger, _targetPlatform, Name); Services.TryAddSingleton(logger); Services.TryAddSingleton <IDiagnosticsData>(diagnostics); var result = InvokeInternal(logger).GetAwaiter().GetResult(); diagnostics.ExitCode = result; // Save diagnostic data into a file if (result != ExitCode.HELP_SHOWN && !string.IsNullOrEmpty(diagnosticsPath)) { diagnostics.SaveToJsonFile(diagnosticsPath); } return((int)result); } catch (Exception e) { parseLogger.LogCritical(e.ToString()); return((int)ExitCode.GENERAL_FAILURE); } }
public ToggleListeningCortanaCommand(string argument, CommandDiagnostics diagnostics = null) : base(ToggleListening, argument, diagnostics) /*Super constructor does everything*/ }