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(); }
protected string GetCommandInputValue(CommandInput input) => parsedInputs.ContainsKey(input) ? parsedInputs[input] : string.Empty;