addPathAsSegments method

void addPathAsSegments(
  1. Iterable<String> segments,
  2. T value, {
  3. Iterable<String> tags = const ['*'],
  4. Map<String, String>? pathRegEx,
})

Implementation

void addPathAsSegments(Iterable<String> segments, T value,
    {Iterable<String> tags: const ['*'], Map<String, String>? pathRegEx}) {
  pathRegEx ??= {};
  SubTree<T> subtree = _tree;
  final int numSegs = segments.length;
  for (int i = 0; i < numSegs; i++) {
    String seg = segments.elementAt(i);
    if (i == numSegs - 1 &&
        (seg == '*' || (seg.startsWith(':') && seg.endsWith('*')))) {
      for (String tag in tags) {
        // TODO what if there is already a value here?
        subtree.globValue[tag] = value;
      }
      return;
    } else if (seg.startsWith(':')) {
      String name = seg.substring(1);
      if (!pathRegEx.containsKey(name)) {
        SubTree<T>? next = subtree.varSubTree;
        if (next == null) {
          next = SubTree<T>();
          subtree.varSubTree = next;
        }
        subtree = next;
      } else {
        SubTree<T> next = SubTree<T>();
        subtree.regexes.add(MapEntry(RegExp(pathRegEx[name]!), next));
        subtree = next;
      }
    } else {
      SubTree<T>? next = subtree.fixed[seg];
      if (next == null) {
        next = SubTree<T>();
        subtree.fixed[seg] = next;
      }
      subtree = next;
    }
  }

  for (String tag in tags) {
    // TODO what if there is already a value here?
    subtree.value[tag] = value;
  }
}