distributeParsers method

Future<Map<String, Object>> distributeParsers({
  1. required List<Parser> allParsers,
  2. required List<Parser> rootParsers,
  3. required Data parentData,
  4. required Uri? proxyUrl,
  5. required bool debug,
})

Helper function to distribute parsers

Implementation

Future<Map<String, Object>> distributeParsers({
  required List<Parser> allParsers,
  required List<Parser> rootParsers,
  required Data parentData,
  required Uri? proxyUrl,
  required bool debug,
}) async {
  /// Ids used for internal functionality, no need to return it to user
  List<String> privateIds = [];

  /// Final data parsed
  Map<String, Object> parsedData = {};

  for (final parser in rootParsers) {
    String id = parser.id;

    /// Skip other parsers with same id because we already got data
    if (parsedData.containsKey(id) && id != "url") {
      continue;
    }

    Data? data = await runParserAndExecuteOptional(
      parser: parser,
      parentData: parentData,
      proxyUrl: proxyUrl,
      debug: debug,
    );
    Object? obj = data?.obj;
    if (obj != null) {
      if (parser.isPrivate) {
        privateIds.add(id);
      }
      parsedData.addAll({id: obj});
      List<Parser> childParsers = childFinder(id, allParsers);
      if (childParsers.isNotEmpty) {
        if (obj is Iterable && parser.multiple) {
          /// Run child parsers for each data entry
          /// Add parent id to public data as empty list
          parsedData.addAll({id: []});
          for (final singleData in obj) {
            var childrenResults = await distributeParsers(
              allParsers: allParsers,
              rootParsers: childParsers,
              parentData: Data(Uri.base, singleData),
              proxyUrl: proxyUrl,
              debug: debug,
            );

            if (childrenResults.isNotEmpty) {
              (parsedData[id] as List).add(childrenResults);
            }
          }
        } else {
          /// Run child parsers for data
          Map<String, Object> childResult = await distributeParsers(
            allParsers: allParsers,
            rootParsers: childParsers,
            parentData: data!,
            proxyUrl: proxyUrl,
            debug: debug,
          );
          if (childResult.isNotEmpty) {
            parsedData.addAll(childResult);
          }
        }
      }
    }
  }
  for (String id in privateIds) {
    parsedData.remove(id);
  }
  return parsedData;
}