parseFlags method

Iterable<NatrixFlag> parseFlags(
  1. List<String> mergedArguments,
  2. Iterable<NatrixFlag> predefinedFlags
)

Using the predefinedFlags, it is possible to determine the corresponding NatrixFlag called from the input values (mergedArguments) and create a copy of the instance with the new value provided.

Implementation

Iterable<NatrixFlag> parseFlags(
  final List<String> mergedArguments,
  final Iterable<NatrixFlag> predefinedFlags,
) {
  final List<String> args = mergedArguments;
  final List<NatrixFlag> flags = [];

  for (NatrixFlag f in predefinedFlags) {
    NatrixParserFlag? raw;

    for (int i = 0; i < args.length; i++) {
      if (!args[i].startsWith("-")) {
        continue;
      }
      final NatrixParserFlag r = parseRawFlag(args[i]);
      if (r.isShort ? f.acronym != r.tag : f.id != r.tag) {
        continue;
      }
      if (f is NatrixBoolFlag || r.val.isNotEmpty) {
        raw = r;
        break;
      }
      final String e =
          "The flag with the identifier \"$r\" requires a value.";
      if (i >= args.length - 1) {
        throw Exception(e);
      }
      final String val = args[i + 1];
      if (val.startsWith("-")) {
        throw Exception(e);
      }
      raw = r.set(val);
      break;
    }
    if (raw == null) {
      flags.add(f);
      continue;
    }
    flags.add(f.set(f.parse(raw.val)));
  }
  return flags;
}