コード例 #1
0
        public async Task RunAsync(string[] args)
        {
            var index = 0;

            parsedInputs    = new Dictionary <CommandInput, string>();
            parsedArguments = new Dictionary <CommandArgument, string>();
            parsedModifiers = new List <CommandModifier>();

            while (index < args.Length)
            {
                bool tokenParsed = false;

                string currentToken = args[index];

                if (inputs.Any(i => i.Required))
                {
                    var input = inputs.FirstOrDefault(i => i.Required && i.Index == index);
                    if (input != null)
                    {
                        parsedInputs.Add(input, currentToken);
                        tokenParsed = true;
                    }
                    int?lastRequiredInputParsedIndex = parsedInputs.Keys.OrderBy(k => k.Index).LastOrDefault()?.Index;
                    if (index >= requiredInputsCount && lastRequiredInputParsedIndex.GetValueOrDefault() < index)
                    {
                        throw new InvalidOperationException($"Required inputs not provided {string.Join(", ", inputs.OrderBy(i => i.Index).Where(i => i.Required && i.Index > lastRequiredInputParsedIndex).Select(i => i.Name))}");
                    }
                }

                if (!tokenParsed)
                {
                    var argName  = currentToken.TrimStart('-');
                    var argument = arguments.FirstOrDefault(a => a.Name == argName || a.Alias == argName);
                    if (argument != null)
                    {
                        index++;
                        string argValue = args[index];
                        parsedArguments.Add(argument, argValue);
                        tokenParsed = true;
                    }
                }

                if (!tokenParsed && inputs.Any())
                {
                    CommandInput input = inputs.FirstOrDefault(i => i.Index == index);
                    if (input != null)
                    {
                        parsedInputs.Add(input, currentToken);
                        tokenParsed = true;
                    }
                }

                if (tokenParsed)
                {
                    index++;
                }
                else
                {
                    throw new InvalidOperationException($"Can not parse {args[index]}");
                }
            }

            await RunCommandAsync();
        }
コード例 #2
0
 protected string GetCommandInputValue(CommandInput input) => parsedInputs.ContainsKey(input) ? parsedInputs[input] : string.Empty;