distributeParsers method
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;
}