Arguments.parse constructor

Arguments.parse(
  1. List<String> args, {
  2. Set<String>? flags,
  3. Map<String, String>? abbreviations,
  4. bool caseSensitive = false,
})

Parses args.

  • flags the flags keys.
  • abbreviations the keys abbreviations.
  • caseSensitive if false, keys are toLowerCase.

Implementation

factory Arguments.parse(
  List<String> args, {
  Set<String>? flags,
  Map<String, String>? abbreviations,
  bool caseSensitive = false,
}) {
  abbreviations ??= <String, String>{};

  var parsedParams = <String, dynamic>{};
  var parsedFlags = <String>{};

  for (var i = 0; i < args.length;) {
    var key = args[i];

    String? name;
    var flagName = false;

    if (key.startsWith('-')) {
      var match = _namedParameter.firstMatch(key);

      if (match != null) {
        name = match.group(1)!;

        if (!caseSensitive) {
          name = name.toLowerCase();
        }

        if (!key.startsWith('--')) {
          var name2 = abbreviations[name];
          if (name2 != null) {
            name = name2;
          } else if (i < args.length - 1) {
            var next = args[i + 1];
            var nextKey = _namedParameter.hasMatch(next);
            flagName = nextKey;
          } else {
            flagName = true;
          }
        }
      }
    }

    if (name != null) {
      if (flags != null && flags.contains(name)) {
        args.removeAt(i);
        parsedFlags.add(name);
      } else if (flagName) {
        args.removeAt(i);
        parsedFlags.add(name);
      } else if (i < args.length - 1) {
        var val = args.removeAt(i + 1);
        args.removeAt(i);
        _addToMap(parsedParams, name, val);
      } else {
        throw StateError('Should be a flag');
      }
    } else {
      ++i;
    }
  }

  return Arguments(args,
      parameters: parsedParams,
      flags: parsedFlags,
      abbreviations: abbreviations);
}