parseArguments method

AFCommandArgumentsParsed parseArguments({
  1. required AFCommand command,
  2. int unnamedCount = -1,
  3. required Map<String, String?> named,
})

Used to parse the command's arguments at a high-level.

named is a map from an argument to a default value for that argument. Do not prefix the argument name with '--'.

Implementation

AFCommandArgumentsParsed parseArguments({
  required AFCommand command,
  int unnamedCount = -1,
  required Map<String, String?> named,
}) {
  final unnamed = <String>[];
  final allNamed = Map<String, String?>.from(named);
  allNamed[AFCommand.argPrivate] = "false";
  allNamed[AFGenerateSubcommand.argExportTemplatesFlag] = "";
  allNamed[AFGenerateSubcommand.argOverrideTemplatesFlag] = "";
  allNamed[AFGenerateSubcommand.argForceOverwrite] = "";

  //final foundNamed = Map<String, String?>.from(named);
  final foundNamed = <String, String?>{};
  foundNamed[AFCommand.argPrivate] = "false";
  final source = rawArgs;

  for(var i = 0; i < source.length; i++) {
    final arg = source[i];
    if(arg.startsWith(AFCommand.optionPrefix)) {
      var argValue = AFCommandArgumentsParsed.argTrue;
      if((i+1 < source.length)) {
        final next = source[i+1];
        if(!next.startsWith(AFCommand.optionPrefix)) {
          argValue = next;
          i++;
        }
      }
      final argEntry = arg.substring(2);
      foundNamed[argEntry] = argValue;
    } else {
      unnamed.add(arg);
    }
  }

  for(final namedKey in pullDownArguments)  {
    for(final parent in parents) {
      final found = foundNamed[namedKey];
      if(found != null) {
        continue;
      }

      final parentVal = parent.findArgument("--$namedKey");
      if(parentVal != null) {
        foundNamed[namedKey] = parentVal.toString();
        continue;
      }
    }
  }

  for(final namedKey in named.keys) {
    final found = foundNamed[namedKey];
    if(found == null) {
      foundNamed[namedKey] = named[namedKey];
    }
  }

  final parsedArguments = AFCommandArgumentsParsed(
    named: foundNamed,
    unnamed: unnamed,
  );

  if(unnamedCount >= 0 && unnamed.length != unnamedCount) {
    command.throwUsageError("Expected $unnamedCount unnamed arguments, but found ${unnamed.length}");
  }

  for(final foundKey in foundNamed.keys) {
    if(!allNamed.containsKey(foundKey) && !AFCommandContext.pullDownArguments.contains(foundKey)) {
      command.throwUsageError("Found unexpected option --$foundKey");
    }
  }

  return parsedArguments;
}