parse method Null safety

ArgResults parse()

Parses the arguments. This can only be called once.


ArgResults parse() {
  var arguments = _args.toList();
  if (_grammar.allowsAnything) {
    return newArgResults(
        _grammar, const {}, _commandName, null, arguments, arguments);

  ArgResults? commandResults;

  // Parse the args.
  while (_args.isNotEmpty) {
    if (_current == '--') {
      // Reached the argument terminator, so stop here.

    // Try to parse the current argument as a command. This happens before
    // options so that commands can have option-like names.
    var command = _grammar.commands[_current];
    if (command != null) {
      _validate(_rest.isEmpty, 'Cannot specify arguments before a command.');
      var commandName = _args.removeFirst();
      var commandParser = Parser(commandName, command, _args, this, _rest);

      try {
        commandResults = commandParser.parse();
      } on ArgParserException catch (error) {
        throw ArgParserException(
            error.message, [commandName, ...error.commands]);

      // All remaining arguments were passed to command so clear them here.

    // Try to parse the current argument as an option. Note that the order
    // here matters.
    if (_parseSoloOption()) continue;
    if (_parseAbbreviation(this)) continue;
    if (_parseLongOption()) continue;

    // This argument is neither option nor command, so stop parsing unless
    // the [allowTrailingOptions] option is set.
    if (!_grammar.allowTrailingOptions) break;

  // Check if mandatory and invoke existing callbacks.
  _grammar.options.forEach((name, option) {
    var parsedOption = _results[name];

    // Check if an option was mandatory and exist
    // if not throw an exception
    if (option.mandatory && parsedOption == null) {
      throw ArgParserException('Option $name is mandatory.', [name]);

    var callback = option.callback;
    if (callback == null) return;

  // Add in the leftover arguments we didn't parse to the innermost command.
  return newArgResults(
      _grammar, _results, _commandName, commandResults, _rest, arguments);