Пример #1
0
    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);
        }
    }
Пример #2
0
 public ToggleListeningCortanaCommand(string argument, CommandDiagnostics diagnostics = null) : base(ToggleListening, argument, diagnostics) /*Super constructor does everything*/ }