splitSelectorFromArgs function

({List<String> rest, String selectorExpression})? splitSelectorFromArgs(
  1. List<String> args, {
  2. bool preferTrailingValue = false,
})

Split selector from remaining arguments.

Implementation

({String selectorExpression, List<String> rest})? splitSelectorFromArgs(
  List<String> args, {
  bool preferTrailingValue = false,
}) {
  if (args.isEmpty) return null;
  var i = 0;
  final boundaries = <int>[];
  while (i < args.length && isSelectorToken(args[i])) {
    i += 1;
    final candidate = args.sublist(0, i).join(' ').trim();
    if (candidate.isEmpty) continue;
    if (tryParseSelectorChain(candidate) != null) {
      boundaries.add(i);
    }
  }
  if (boundaries.isEmpty) return null;
  var boundary = boundaries.last;
  if (preferTrailingValue) {
    for (var i = boundaries.length - 1; i >= 0; i -= 1) {
      if (boundaries[i] < args.length) {
        boundary = boundaries[i];
        break;
      }
    }
  }
  final selectorExpression = args.sublist(0, boundary).join(' ').trim();
  if (selectorExpression.isEmpty) return null;
  return (selectorExpression: selectorExpression, rest: args.sublist(boundary));
}